【问题标题】:Deserialize Json C# checking if list or not [duplicate]反序列化Json C#检查是否列表[重复]
【发布时间】:2016-12-30 08:42:01
【问题描述】:

我在使用 newtonsoft json 反序列化 Json 时遇到问题。

我有课

[Serializable]
public class ValueAdd
{
    [JsonProperty(PropertyName = "@id")]
    public string Description { get; set; }

    [JsonProperty(PropertyName = "@description")]
    public string Id { get; set; }
}

[Serializable]
public class ValueAdds
{ 
    public List<ValueAdd> ValueAdd { get; set; }

    [JsonProperty(PropertyName = "@size")]
    public string Size { get; set; }
}

API 返回愚蠢的两种格式:一个我可以正确序列化:

"ValueAdds":
{
   "@size": "3",
   "ValueAdd":
   [
    {
        "@id": "2103",
        "description": "some property"
    },
    {
        "@id": "2192",
        "description": "some property"
    },
    {
        "@id": "2196",
        "description": "some property"
    }
   ]
}

但是当他们返回一个属性时,它并没有返回一个列表.. 只能以这种方式返回:

"ValueAdds":
{
   "@size": "1",
   "ValueAdd":
    {
        "@id": "2103",
        "description": "some property"
    }
}

导致我出现解析器错误

JsonConvert.DeserializeObject<ValueAdds>(_response);

Newtonsoft.Json.dll 中发生了“Newtonsoft.Json.JsonSerializationException”类型的第一次机会异常

附加信息:无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[myproperty]',因为该类型需要 JSON 数组(例如 [ 1,2,3]) 正确反序列化。

我的问题是,有没有办法解决它?我无法更改 api 响应,我需要更改尝试解析是否有列表..

【问题讨论】:

标签: c# arrays json serialization json.net


【解决方案1】:

因为在您的 ValueAds ValueAdd 中是列表,但在您的第二个 json 中它是一个实体,因此您无法分配它,您需要创建另一个模型

[Serializable]
public class ValueAdds2
{ 
    public ValueAdd ValueAdd { get; set; }

    [JsonProperty(PropertyName = "@size")]
    public string Size { get; set; }
}

然后

JsonConvert.DeserializeObject<ValueAdds2>(_response);

【讨论】:

    【解决方案2】:

    实际上,属性应该是数组或对象。你的反应应该是一致的。

    无论如何,要解决问题,你应该将它绑定到动态或对象。

    [Serializable]
    public class ValueAdds
    { 
     public dynamic ValueAdd { get; set; }
    
     [JsonProperty(PropertyName = "@size")]
     public string Size { get; set; }
    }
    

    那么你应该检查 ValueAdd 类型。

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2017-06-08
      • 1970-01-01
      相关资源
      最近更新 更多