我正在尝试将字符串化的json对象从传递到中间层的前端转换。我正在使用NewtonSoft.Json.JsonConvert.DeserializeObject。我没有错。但是,当我设置断点时,我看到该函数在反序列化调用时退出。它不会继续下去。这是我的代码。
public class tranx
{
public Transaction transaction { get; set; }
public List<LineItem> lineItems { get; set; }
}
[HttpGet]
public ActionResult saveTransaction(string transactionJson)
{
tranx t = JsonConvert.DeserializeObject<tranx>(transactionJson);
foreach (LineItem i in t.lineItems)
{
if (i != null)
{
Console.Write(i.CategoryID);
}
}
return View();
}
注意:Transaction和LineItem也是我定义且可以访问的对象。
我不确定为什么代码会在foreach循环之前退出。有什么想法吗?
这是json字符串:
{
"transaction":[
{
"entityID":"",
"date":"2018-05-28"
}
],
"lineItems":[
{
"category":"",
"subCategory":"",
"amount":"",
"tax":0,
"description":"",
"miles":"",
"gallons":""
},
{
"category":"",
"subCategory":"",
"amount":"",
"tax":0,
"description":"",
"miles":"",
"gallons":""
}
]
}
另外,我没有使用任何自定义反序列化器。
答案 0 :(得分:1)
我相信实际发生的事情就是抛出这样的例外:
未处理的异常:Newtonsoft.Json.JsonSerializationException:无法将当前的JSON数组(例如[1,2,3])反序列化为类型&#39; Transaction&#39;因为该类型需要一个JSON对象(例如{&#34; name&#34;:&#34; value&#34;})才能正确反序列化。
这是由于您的JSON将transaction
属性指定为数组:
&#34;交易&#34;:[{&#34; ENTITYID&#34;:&#34;&#34;&#34;日期&#34;:&#34; 2018年5月28日& #34;}]
...而您的transaction
属性只是一个Transaction
。
以下示例代码示例 - 只需将您的示例JSON放入test.json
:
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
public class tranx
{
public Transaction transaction { get; set; }
public List<LineItem> lineItems { get; set; }
}
public class LineItem { }
public class Transaction { }
class Program
{
static void Main()
{
string json = File.ReadAllText("test.json");
tranx t = JsonConvert.DeserializeObject<tranx>(json);
}
}
所以,你有两个问题要解决:
假设您的JSON正确,您的tranx
类需要更改,以使其transaction
属性为列表或数组,例如
public List<Transaction> transaction { get; set; }
您应该弄清楚为什么您无法看到异常。 这非常重要。如果抛出异常并且您无法看到它们,那么维护代码将非常困难。这实际上是我要解决的第一件事。
我还强烈建议您遵循.NET命名约定,其中属性和类型名称大写。您可以使用[JsonProperty]
属性指定如何在JSON中表示值,如果这是以前属性为小写的原因。