使用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);
输出:
一个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 数组
如何使用 NewtonSoft Json.Net 将 Json 字典反序列化为平面类
JSON.Net - 无法将当前 json 对象(例如 "name":"value")反序列化为类型 'system.collections.generic.l