使用JSON.NET反序列化json - 无法反序列化,因为类型需要一个JSON数组c#

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用JSON.NET反序列化json - 无法反序列化,因为类型需要一个JSON数组c#相关的知识,希望对你有一定的参考价值。

这是我的json

{
   "odata.metadata" : "",
   "value" : [
      {
         "ItemCode" : "NUOVO_ELEMENT1406",
         "ItemName" : "Prova3",
         "QuantityOnStock" : 0.0
      },
      {
         "ItemCode" : "NUOVO_ELEMENT14506",
         "ItemName" : "Prova3",
         "QuantityOnStock" : 0.0
      },
      {
         "ItemCode" : "NUOVO_ELEMENT1455106",
         "ItemName" : "Prova3",
         "QuantityOnStock" : 0.0
      },
      {
         "ItemCode" : "NUOVO_ELEMENT1455a106",
         "ItemName" : "Prova3",
         "QuantityOnStock" : 0.0
      },
      {
         "ItemCode" : "NUOVO_ELEMENT145574a106",
         "ItemName" : "Prova3",
         "QuantityOnStock" : 0.0
      },
      {
         "ItemCode" : "NUOVO_ELEMENT16",
         "ItemName" : "Prova3",
         "QuantityOnStock" : 0.0
      },
      {
         "ItemCode" : "NUOVO_ELEMENT1d6",
         "ItemName" : "Prova3",
         "QuantityOnStock" : 0.0
      },
      {
         "ItemCode" : "NUOVO_ELEMENT433",
         "ItemName" : "Prova3",
         "QuantityOnStock" : 0.0
      },
      {
         "ItemCode" : "NUOVO_ELEMENT1d464645454546",
         "ItemName" : "UPDATE",
         "QuantityOnStock" : 0.0
      },
      {
         "ItemCode" : "NUOVO_ELEMENT433787079",
         "ItemName" : "Prova3",
         "QuantityOnStock" : 0.0
      },
      {
         "ItemCode" : "NUOVO_ELEMENT43389898989787079",
         "ItemName" : "Prova3121",
         "QuantityOnStock" : 0.0
      }
   ]
}

这是实体,其任务是映射json

public class Item
    {
        [JsonProperty(PropertyName ="ItemCode")]
        public string ItemCode { get; set; }
        [JsonProperty(PropertyName ="ItemName")]
        public string ItemName { get; set; }
        [JsonProperty(PropertyName ="QuantityOnStock")]
        public decimal QuantityOnStock { get; set; }
    }

有了这堂课,我想起了json

internal class JsonParser
    {

        internal void Deserialize(string v)
        {

            List<Item> it = JsonConvert.DeserializeObject<List<Item>>(v);
            foreach (Item item in it)
            {
                Console.WriteLine("{0},{1}", item.ItemName, item.ItemCode);
            }

        }
    }

我试图删除List并仅使用Item,如果我的json只包含一个元素当然没问题,但是在我有更多元素的情况下我尝试使用List我收到标题中描述的错误。

答案

这是因为您尝试反序列化的对象不正确,您应该尝试以下类:

public class Rootobject
{
    [JsonProperty("odata.metadata")]
    public string odatametadata { get; set; }
    public Value[] value { get; set; }
}

public class Value
{
    public string ItemCode { get; set; }
    public string ItemName { get; set; }
    public float QuantityOnStock { get; set; }
}

var items = JsonConvert.DeserializeObject<Rootobject>(json);

输出:

enter image description here

另一答案

一个List<Item>看起来像:

[
  {
     "ItemCode" : "NUOVO_ELEMENT14506",
     "ItemName" : "Prova3",
     "QuantityOnStock" : 0.0
  },
  {
     "ItemCode" : "NUOVO_ELEMENT1455106",
     "ItemName" : "Prova3",
     "QuantityOnStock" : 0.0
  }
]

你没有 - 根对象是一个{...}对象,而不是{...}数组,所以你需要这样的东西:

class SomeWrapper
{
    public List<Item> value { get; set; }
}

并使用DeserializeObject<SomeWrapper>,然后访问.value

另一答案

正如@ Marc-Gravell回答的那样,你的json与Item类不同。要解析json,您应该创建另一个具有Item类类型的List的value属性的类:

public class SomeClass
{
     public List<Item> value { get; set; }
}

编辑:关于“odata.metadata”,也许您可​​以添加“SomeClass”这样的属性:

[JsonProperty("odata.metadata")]
public string metadata { get; set; }
另一答案

如果您不想设置要映射到的类,可以使用dynamic对象。

dynamic it = JsonConvert.DeserializeObject(v);

然后,要访问值,请使用

string itemCode1 = it.value[0].ItemCode.Value;

以上是关于使用JSON.NET反序列化json - 无法反序列化,因为类型需要一个JSON数组c#的主要内容,如果未能解决你的问题,请参考以下文章

JSON.Net无法在自定义JsonConverter中反序列化json数组

使用来自 URL 的 JSON.NET 反序列化 JSON 数组

使用 Json.NET 转换器反序列化属性

如何使用 NewtonSoft Json.Net 将 Json 字典反序列化为平面类

Json.NET:将嵌套数组反序列化为强类型对象

JSON.Net - 无法将当前 json 对象(例如 "name":"value")反序列化为类型 'system.collections.generic.l