反序列化JSON对象

时间:2017-04-27 15:50:00

标签: c# json json.net json-deserialization

我有一个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#类中),我打算改变什么?

2 个答案:

答案 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);