【问题标题】:What to do when deserializing an uneven JsonArray?反序列化不均匀的JsonArray怎么办?
【发布时间】:2017-12-07 12:52:58
【问题描述】:

我正在尝试反序列化 JSON 字符串,其中 JSON 字符串有一个“事件”数组,问题在于当我尝试反序列化字符串时,如下所示,它试图找到“field_name”变量然而,并非数组中的所有对象都以相同的方式构建,只有其中一些具有“field_name”变量。我无法控制相关 API。

基本上我想做什么

dynamic obj = JsonConvert.DeserializeObject(json);
var audits = obj.audits;
List<dynamic> dynamics = JsonConvert.DeserializeObject<List<dynamic>>
(audits.ToString());
List<Event> events = JsonConvert.DeserializeObject<List<Event>>
 (dynamics[0].events.ToString());

//The Event class
public class Event
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("value")]
    public string Value { get; set; }
    [JsonProperty("field_name")]
    public string Field_Name { get; set; }

}

我继续收到此异常:

Newtonsoft.Json.JsonReaderException: Error reading string. Unexpected token: 
StartArray. Path '[5].value', line 44, position 15.

JSON 数组是这样的:

[{
   "id":"id",
   "field_name":"field_name",
   "something":"something"
},{
   "id":"id",
   "number":"number",
   "something":"something"
},{
   "id":"id",
   "field_name":"field_name",
   "something":"something"
},{
   "id":"id",
   "name":"name",
   "something":"something"
}]

【问题讨论】:

  • 对于您正在使用的库,缺失值通常不应该是问题。你能告诉我们第 44 行是什么样子的吗?您的事件模型似乎没有正确反映 JSON 的结构,或者您的 JSON 字符串格式不正确。
  • dynamics[0].events 未在您提供的 JSON 中定义。我得到一个 RuntimeBinderException (NULL -Exception)。也许你可以空检查它。或提供一些代码(例如,单元测试),它实际上会重现您的问题。
  • 有一次我遇到了这个问题,经过大量搜索并没有找到任何东西,我使用 foreach 创建了我的对象。
  • @MilosMrdovic 行号可以更改,但现在我实际上认为我发现了问题,似乎“值”属性既可以是字符串也可以是数组,最好的做法是处理这种错误?。
  • @codingmonkey 对。我想你会在这里找到答案stackoverflow.com/questions/35978392/… 或这里stackoverflow.com/questions/29688498/…

标签: c# json json.net deserialization


【解决方案1】:

您可以使用 ObjectMapper 如下:

private ObjectMapper objectMapper = new ObjectMapper();

List<Event> events = readValue(dynamics[0].events.ToString(), new TypeReference<List<Event>>() {});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多