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

3
这是我的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时,我会收到标题中描述的错误。


你能否将你的JSON添加到问题中,因为不是每个人都能够访问pastebin。此外,pastebin可能会消失,导致问题不完整。 - phuzi
数组中的“Item”对象部分位于JSON的“value”属性内。因此,您需要针对该属性进行特定的反序列化,或者使用包装类来表示包含数组的对象,并将其反序列化为该类。例如:public class SomeClass { public List<Item> value { get; set; } 等等。 - ADyson
你在这里传递的是对象,而不是 JSON 数组到 Deserialize() 方法。使用以下输入将正常工作:[{ItemCode:'ItemCode1',ItemName:'ItemName1',QuantityOnStock:'10.25'},{ItemCode:'ItemCode2',ItemName:'ItemName2',QuantityOnStock:'10.25'}] - Tanmay
4个回答

1

一个 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

ItemWrapper it = JsonConvert.DeserializeObject<ItemWrapper>(v); it.value = new List<Item>(); foreach (Item item in it.value) { Console.WriteLine("{0},{1}", item.ItemName, item.ItemCode); } 将变量v反序列化为ItemWrapper对象,并赋值给it。 将it的value属性初始化为空的Item列表。 遍历it中的每个Item,输出其名称和代码。 - Riccardo Pezzolati
@RiccardoPezzolati,你的 it.value = new List<Item>() 把你感兴趣的数据丢掉了...只需删除那一行即可。 - Marc Gravell
ItemWrapper it = JsonConvert.DeserializeObject<ItemWrapper>(v); foreach (Item item in it.value) { Console.WriteLine("{0},{1}", item.ItemName, item.ItemCode); } 我遇到了NullReferenceException,我做错了什么? - Riccardo Pezzolati

1

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

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


我猜测,为了使 "odatametadata" 正常工作,需要使用 [JsonProperty("odata.metadata")] 或类似的方法。 - Marc Gravell
var items = JsonConvert.DeserializeObject<Rootobject>(json); 返回 NullReferenceException。 - Riccardo Pezzolati
@RiccardoPezzolati,你试过我提到的类吗? - FaizanHussainRabbani
@RiccardoPezzolati 很高兴能帮到您,请将答案标记为正确,因为这对其他寻找已接受答案的人也会很有帮助。 - FaizanHussainRabbani

0
如@Marc-Gravell所回答的那样,您的jsonItem类不同。 为了解析您的json,您应该创建另一个类,该类具有List类型的Item类的value属性:
public class SomeClass
{
     public List<Item> value { get; set; }
}

编辑: 关于 "odata.metadata",也许您可以在 "SomeClass" 中添加一个类似这样的属性:

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

0

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

dynamic it = JsonConvert.DeserializeObject(v);

然后,要访问一个值,请使用

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

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