如何在C#中解析JSON列表

3
如何在C#中解析这个JSON列表?我已经在我的服务端读取了这个列表。我正在使用Web API。
[
{ "Id":1,
  "Adjustment":{
    "CardNumber": "1234567895678",
    "TimeStamp": "2016-06-14 12:00:56",
    "Point": -13.09
    }
},
{ "Id":2,
  "Adjustment":{
    "CardNumber": "2345673245689",
    "TimeStamp": "2016-06-14 12:05:43",
    "Point": 2.3
    }
}
] 

我按照这种方式做了,但它不起作用:我该如何修复我的代码?你有什么建议吗?我使用Fiddler发送了请求体。

public object InsertNewCustomer([FromBody] object value)
{
    var returns = new List<object>();

    if (value == null)
    {
        returns.Add(new { ReturnCode = "-1" });

        return Json(returns, JsonRequestBehavior.AllowGet).Data;
    }
    var jsonstr = @value.ToString();

    var jsonVal = JArray.Parse(jsonstr);



    Cariler newcustomer = new Cariler();

    using (TransactionScope scope = new TransactionScope())
    {

        foreach (JObject root in jsonVal)
        {
            foreach (KeyValuePair<String, JToken> app in root)
            {

                var card = (String)app.Value["CardNumber"];
                var time = (String)app.Value["TimeStamp"];
                var point = (byte)app.Value["Point"];

                newcustomer.CardNum = card;
                newcustomer.Time = time;
                newcustomer.Point = point;
                context.Cariler.Add(newcustomer);
                context.SaveChanges();
            }
        }


        scope.Complete();
        returns.Add(new { ReturnCode = "0" });

        return Json(returns, JsonRequestBehavior.AllowGet).Data;
    }
}

产生了以下错误:
{"Message":"发生错误。","ExceptionMessage":"无法访问Newtonsoft.Json.Linq.JValue上的子值。","ExceptionType":"System.InvalidOperationException","StackTrace":"在Newtonsoft.Json.Linq.JToken.get_Item(Object key)\r\n 在TestWebApi.Controllers.ValuesController.InsertNewCustomer(Object value) 位置 c:\Users\sezer.erdogan.PROMAKS\Desktop\LYLWebApi\LYLWebApi\Controllers\ValuesController.cs:line 64\r\n 在lambda_method(Closure , Object , Object[] )\r\n 在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.b__9(Object instance, Object[] methodParameters)\r\n 在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n 在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- 前一个位置引发了异常的堆栈跟踪的结尾 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n 在 System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\r\n--- 前一个位置引发了异常的堆栈跟踪的结尾 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n 在 System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- 前一个位置引发了异常的堆栈跟踪的结尾 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n 在 System.Web.Http.Controllers.AuthenticationFilterResult.d__0.MoveNext()\r\n--- 前一个位置引发了异常的堆栈跟踪的结尾 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()"}

1
我们是打算猜测“它不工作”吗?你有什么证据表明它不工作?你应该把这加到你的问题中。 - spender
我添加了返回错误 - Sezer Erdogan
3个回答

8
json2csharp.com 上,你可以为你的 JSON 生成类。对于你的 JSON,它们可能会像这样:
public class Adjustment
{
    public string CardNumber { get; set; }
    public string TimeStamp { get; set; }
    public double Point { get; set; }
}

public class RootObject
{
    public int Id { get; set; }
    public Adjustment Adjustment { get; set; }
}

然后对其进行反序列化:

List<RootObject> o = JsonConvert.DeserializeObject<List<RootObject>>(string json)

3
在Visual Studio中也可以这样做:编辑 -> 特殊粘贴 -> 以类的形式粘贴JSON。 - Aleksey L.
在我的函数中,我该如何使用RootObject? - Sezer Erdogan

1
使用您提供的 JSON 结构,http://json2csharp.com/ 给出以下结果:
public class Adjustment
{
    public string CardNumber { get; set; }
    public string TimeStamp { get; set; }
    public double Point { get; set; }
}

public class RootObject
{
    public int Id { get; set; }
    public Adjustment Adjustment { get; set; }
}

在您的控制器操作中将它们作为数组接受:

public class SomeController : ApiController
{
    public IHttpActionResult Post([FromBody] RootObject[] values)
    {
        // do stuff
        return Ok();
    }
}

在我的函数中,我该如何使用RootObject? - Sezer Erdogan

0

1) 你需要发送一个包含模型列表的类,而不是类列表

2) 创建新类并复制你的JSON

3) 编辑 > 粘贴特殊 > 将JSON粘贴为类 现在你有了类

使用此代码获取数据

RootObject answerFromServer = new RootObject();
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(RootObject));
answerFromServer = (RootObject)serializer.ReadObject(stream);

现在使用您的根类


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接