我有一个json对象,如下所示:
[
{"attributes": []},
{"attribute_values": []},
{"digital_assets": []},
{"products": []},
]
所以我想如果我创建了以下c#类,我可以使用newtonsofts JsonConvert.Deserialize<ProductContainer>()
直接反序列化它:
public class ProductContainer
{
[JsonProperty(PropertyName = "attributes")]
public AttributeEntity[] Attributes { get; set; }
[JsonProperty(PropertyName = "attribute_values")]
public AttributeValueEntity[] AttributeValues { get; set; }
[JsonProperty(PropertyName = "digital_assets")]
public DigitalAssetEntity[] DigitalAssets { get; set; }
[JsonProperty(PropertyName = "products")]
public ProductEntity[] Products { get; set; }
}
但是,我收到以下错误:
无法将当前JSON数组(例如[1,2,3])反序列化为类型“ProductContainer”,因为该类型需要JSON对象(例如{“name”:“value”})才能正确反序列化。 要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList),例如List从JSON数组反序列化。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。 路径'',第1行,第1位。
我认为可能是因为我的JSON格式不正确。为了使其正常工作(在JSON文件或C#类中),我打算改变什么?
答案 0 :(得分:1)
正如您在console.log(user[0].password);
字符串中看到的那样,它是Json
个对象
我描述了this回答中的差异。
问题是,您的array
类型包含Dictionary
作为键,string
作为值。
在你的情况下:
array
您必须先将其反序列化,然后说[
{"attributes": []},
{"attribute_values": []},
{"digital_assets": []},
{"products": []},
]
或JObject[]
:
List<JObject>
然后处理这些对象中的每一个并查找键值并分配值,或者只需更改Json对象的第一个和最后一个字符:
var objects = JsonConvert.Deserialize<List<JObject>>();
将返回:
string newJsonString = "{" + oldJsonString.Substring(1, oldJsonString.Length - 2) + "}";
这里的小评论
这仍然会返回一个对象,该对象包含一个键和值对,其中键的类型为{
{"attributes": []},
{"attribute_values": []},
{"digital_assets": []},
{"products": []},
}
,值为string
。但是使用第二种方法,您可以使用array
对其进行反序列化,然后将每个对象反序列化为正确的类型,例如:
JsonConvert.Deserialize<Dictionary<string, JObject>>();
答案 1 :(得分:1)
如果要将JSON字符串反序列化为C#对象,则需要将其设为JSON对象(而不是数组):
{
"attributes": [],
"attribute_values": [],
"digital_assets": [],
"products": [],
}
如果您需要保留原始JSON数组而不是使用其他结构进行反序列化,则需要保留原始JSON数组,例如:
JsonConvert.DeserializeObject<List<Dictionary<string, object>>(obj);