c#Newtonsoft.Json DeserializeObject错误

时间:2016-11-14 10:30:40

标签: c# json

我试图反序列化以下json对象但是出错了,我想做的就是把json放到c#List中:

public class CardTextModel
{
    public string prod_Code { get; set; }
    public string page1Text { get; set; }
    public string insideText { get; set; }
    public string userName { get; set; }
    public Nullable<System.DateTime> exportDate { get; set; }
    public List<CardTextModel> card_Text { get; set; }
}

这是我尝试反序列化json的地方

class Program
{
    static void Main(string[] args)
    {
        try
        {
            var content = @"{
              ""card_Text"": [
                {
                  ""prod_Code"": ""G01Q0320WS"",
                  ""page1Text"": ""SHORTY SET SZ 10"",
                  ""insideText"": ""SHORTY SET SZ 10"",
                  ""userName"": ""daz"",
                  ""exportDate"": null
                },
                {
                  ""prod_Code"": ""G01Q0380"",
                  ""page1Text"": ""TREE DECS SET 4 RESIN"",
                  ""insideText"": ""TREE DECS SET 4 RESIN"",
                  ""userName"": ""mark"",
                  ""exportDate"": null
                }
              ]
            }";

            var model = JsonConvert.DeserializeObject<List<CardTextModel>>(content);
        }
        catch (Exception ex)
        {

        }
    }
}

当我尝试取消激活我的json对象时,我收到以下错误

  

无法将当前JSON对象(例如{&#34; name&#34;:&#34; value&#34;})反序列化为类型System.Collections.Generic.List`1 [CardTextModel]& #39;因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。   要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。   路径&#39; card_Text&#39;,第2行,第30位。

我使用的是Newtonsoft.Json 9.0.0.0

感谢您的帮助

6 个答案:

答案 0 :(得分:1)

你的json应该是这样的:

var content = @"[
                {
                  ""prod_Code"": ""G01Q0320WS"",
                  ""page1Text"": ""SHORTY SET SZ 10"",
                  ""insideText"": ""SHORTY SET SZ 10"",
                  ""userName"": ""daz"",
                  ""exportDate"": null
                },
                {
                  ""prod_Code"": ""G01Q0380"",
                  ""page1Text"": ""TREE DECS SET 4 RESIN"",
                  ""insideText"": ""TREE DECS SET 4 RESIN"",
                  ""userName"": ""mark"",
                  ""exportDate"": null
                }
              ]";

var model = JsonConvert.DeserializeObject<List<CardTextModel>>(content);

或者您的对象需要更改以支持根元素card_Text

public class CardTextModel
{
    public string prod_Code { get; set; }
    public string page1Text { get; set; }
    public string insideText { get; set; }
    public string userName { get; set; }
    public Nullable<System.DateTime> exportDate { get; set; }
    public List<CardTextModel> card_Text { get; set; }
}

public class CardTextModelRoot
{
    public List<CardTextModel> card_Text {get;set;}
}

var content = @"{
      ""card_Text"": [
        {
          ""prod_Code"": ""G01Q0320WS"",
          ""page1Text"": ""SHORTY SET SZ 10"",
          ""insideText"": ""SHORTY SET SZ 10"",
          ""userName"": ""daz"",
          ""exportDate"": null
        },
        {
          ""prod_Code"": ""G01Q0380"",
          ""page1Text"": ""TREE DECS SET 4 RESIN"",
          ""insideText"": ""TREE DECS SET 4 RESIN"",
          ""userName"": ""mark"",
          ""exportDate"": null
        }
      ]
    }";

var model = JsonConvert.DeserializeObject<CardTextModelRoot>(content);

答案 1 :(得分:1)

因为在你的json中你有一个属性card_Text,它被分配给数组。修改你的json或添加一个相同的存根类。

修改后的代码

public class ModelHolder{
    public List<CardTextModel> card_Text {get;set;}
}

在您的反序列化代码中

var model = JsonConvert.DeserializeObject<ModelHolder>(content);

修改了json

var content = @"[
    {
      ""prod_Code"": ""G01Q0320WS"",
      ""page1Text"": ""SHORTY SET SZ 10"",
      ""insideText"": ""SHORTY SET SZ 10"",
      ""userName"": ""daz"",
      ""exportDate"": null
    },
    {
      ""prod_Code"": ""G01Q0380"",
      ""page1Text"": ""TREE DECS SET 4 RESIN"",
      ""insideText"": ""TREE DECS SET 4 RESIN"",
      ""userName"": ""mark"",
      ""exportDate"": null
    }
  ]";

答案 2 :(得分:0)

您的内容不是数组,而是包含一个字段&#34; card_Text&#34;的JSON对象,其中包含您正在寻找的数组。

将DeserializeObject的类型参数修改为类,例如

class CardTextWrapperModel
{
    public List<CardTextModel> card_Text { get; set; }
}

或直接传递数组而不使用外部对象:

var content = @"[
            {
              ""prod_Code"": ""G01Q0320WS"",
              ""page1Text"": ""SHORTY SET SZ 10"",
              ""insideText"": ""SHORTY SET SZ 10"",
              ""userName"": ""daz"",
              ""exportDate"": null
            },
            {
              ""prod_Code"": ""G01Q0380"",
              ""page1Text"": ""TREE DECS SET 4 RESIN"",
              ""insideText"": ""TREE DECS SET 4 RESIN"",
              ""userName"": ""mark"",
              ""exportDate"": null
            }
          ]";

答案 3 :(得分:0)

你的JSON不是一个数组,它是一个有一个名为&#34; card_Text&#34;这是一个数组。 试试这个:

 public class CardsModel
    {
        public List<CardTextModel> card_Text { get; set; }
    }
    public class CardTextModel
    {
        public string prod_Code { get; set; }
        public string page1Text { get; set; }
        public string insideText { get; set; }
        public string userName { get; set; }
        public Nullable<System.DateTime> exportDate { get; set; }
        public List<CardTextModel> card_Text { get; set; }
    }


var model = JsonConvert.DeserializeObject<CardsModel>(content);

答案 4 :(得分:0)

要进一步了解流程,您可以选择测试对象与实际JSON转换的兼容性。尝试从“CardTextModel”对象列表生成JSON字符串。

var cardList = new List<CardTextModel>(){
    new CardTextModel{ 
        prod_Code = "G01Q0320WS",
        page1Text = "SHORTY SET SZ 10",
        insideText = "SHORTY SET SZ 10",
        userName = "daz",
        exportDate = null
    },
    new CardTextModel{ 
        prod_Code = "G01Q0380",
        page1Text = "TREE DECS SET 4 RESIN",
        insideText = "TREE DECS SET 4 RESIN",
        userName = "mark",
        exportDate = null
    },
};

string output = JsonConvert.SerializeObject(cardList);

输出结果为:

"[{\"prod_Code\":\"G01Q0320WS\",\"page1Text\":\"SHORTY SET SZ 10\",\"insideText\":\"SHORTY SET SZ 10\",\"userName\":\"daz\",\"exportDate\":null},{\"prod_Code\":\"G01Q0380\",\"page1Text\":\"TREE DECS SET 4 RESIN\",\"insideText\":\"TREE DECS SET 4 RESIN\",\"userName\":\"mark\",\"exportDate\":null}]"

因此,我们现在可以使用输出作为基础。 回到你的问题,这是实际的代码。

class Program
    {
        static void Main(string[] args)
        {
            var content = "[{\"prod_Code\":\"G01Q0320WS\",\"page1Text\":\"SHORTY SET SZ 10\",\"insideText\":\"SHORTY SET SZ 10\",\"userName\":\"daz\",\"exportDate\":null},{\"prod_Code\":\"G01Q0380\",\"page1Text\":\"TREE DECS SET 4 RESIN\",\"insideText\":\"TREE DECS SET 4 RESIN\",\"userName\":\"mark\",\"exportDate\":null}]";

            var model = JsonConvert.DeserializeObject<List<CardTextModel>>(content);
        }
    }

模型的值应该是:

enter image description here

希望这有帮助! :)

答案 5 :(得分:0)

不确定(没时间检查)但希望它有所帮助。 尝试:

SELECT p1.idA, p1.idB, p1.descriptionNTEXT
FROM   p1 product
WHERE EXISTS
   (
       SELECT 1
       FROM p product, o order, c customer
       WHERE o.productID = p.idA AND o.subProductID = p.idB AND o.customerID = c.ID 
             AND p1.idA = p.ida 
             AND p1.idB = p.idb
   )

真的希望它有帮助))。