JsonConvert结束功能

时间:2018-05-28 16:08:12

标签: c# json.net

我正在尝试将字符串化的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":""
      }
   ]
}

另外,我没有使用任何自定义反序列化器。

1 个答案:

答案 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中表示值,如果这是以前属性为小写的原因。

相关问题