代码之家  ›  专栏  ›  技术社区  ›  Tys

将JSON数组中的对象提取到列表

  •  0
  • Tys  · 技术社区  · 8 年前

    我正在使用C代码,得到的JSON服务结果如下所示:

    [
    {"value":"{\"code\":\"MO\",\"description\":\"Monday\",\"isSet\":false}","nr":1}
    ,{"value":"{\"code\":\"TU\",\"description\":\"Tuesday\",\"isSet\":true}","nr":2}
    ]
    

    我想使用此数组中的反序列化值对象列表。但我的印象是,我的代码有点麻烦。

    JArray j = JArray.Parse(task.Result); 
    List<Booking> b = j.Select(x => JObject.Parse(x["value"].ToString()).ToObject<Booking>()).ToList();
    

    选择字符串并将其解析为对象,然后进行强制转换,真的是这样做的吗?或者可以更有效地做到这一点?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Mahdi Mike Flynn    8 年前

    使用以下类别:

    public class Value
    {
        public string Code { get; set; }
        public string Description { get; set; }
        public bool IsSet { get; set; }
    }
    
    public class RootObject
    {
        [JsonProperty("Booking")]
        public Value Value { get; set; }
        public int Nr { get; set; }
    }
    

    然后反序列化JSON字符串,如下所示:

    var test = JsonConvert.DeserializeObject<List<RootObject>>(json);
    

    JSON字符串需要取消转义:

    [
    {"value":{"code":"MO","description":"Monday","isSet":false},"nr":1},
    {"value":{"code":"TU","description":"Tuesday","isSet":true},"nr":2}
    ]
    

    还有 value 是双引号。删除它们,反序列化工作正常。

    使现代化

    如果不想操纵JSON字符串,可以将其反序列化两次。为此,我更改了如下类:

    public class Value
    {
        public string Code { get; set; }
        public string Description { get; set; }
        public bool IsSet { get; set; }
    }
    
    public class RootObject
    {
        public string Value { get; set; }
        public int Nr { get; set; }
    }
    
    public class ResultRootObject
    {
        public Value Value { get; set; }
        public int Nr { get; set; }
    }
    

    然后我可以将其反序列化为 ResultRootObject :

    var rootObjects = JsonConvert.DeserializeObject<List<RootObject>>(badJson, new JsonSerializerSettings());
    var result = rootObjects.Select(item => new ResultRootObject
    {
        Value = JsonConvert.DeserializeObject<Value>(item.Value),
        Nr = item.Nr
    }).ToList();