【问题标题】:Deserializing nested JSON arrays using RestSharp使用 RestSharp 反序列化嵌套的 JSON 数组
【发布时间】:2015-03-23 10:44:46
【问题描述】:

我正在尝试使用 RestSharp 反序列化以下 JSON 响应。我尝试了各种模型结构来提取数据,但均无济于事。我总是被嵌套数组绊倒。

我无法控制服务,因此无法更改格式。

JSON 格式:

[
    {
        "results": 19,
        "statuscode": 200,
    },
    [
        {
            "id": 24,
            "name": "bob"
        },
        {
            "id": 82,
            "name": "alice"
        }
    ]
]

使用这个模型,我已经能够从第一个对象中提取数据,但仅此而已。我不确定如何准确读取对象之后的数组。

public class Info
{
    public int results { get; set; }
    public int statuscode { get; set; }
}

反序列化示例:

var deserializer = new JsonDeserializer();
var wat = deserializer.Deserialize<List<List<Info>>>(response);

我只是在这里完全遗漏了什么,还是我唯一的选择是编写自定义反序列化器和/或使用 JSON.NET 之类的东西?

【问题讨论】:

    标签: c# json restsharp


    【解决方案1】:

    问题在于您的 JSON 数组异常多态:它的第一个元素是一个对象,而它的第二个元素是一个对象数组。一种更自然的表示方法是作为具有两个命名属性的 JSON 对象——但这不是你所得到的。使用任何序列化程序一步将其直接反序列化为具有两个命名属性的 c# POCO 会很棘手,因为 JSON 数据模型与您所需的数据模型完全不同。相反,反序列化为中间表示并转换可能是最容易的。幸运的是,RestSharp 有适当的中间类JsonObjectJsonArray

    因此,如果您想反序列化为以下类:

    public class Info
    {
        public int results { get; set; }
        public int statuscode { get; set; }
    }
    
    public class IdAndName
    {
        public int id { get; set; }
        public string name { get; set; }
    }
    
    public class ResponseContent
    {
        public Info Info { get; set; }
        public List<IdAndName> Data { get; set; }
    }
    

    你可以这样做:

            var array = (JsonArray)SimpleJson.DeserializeObject(response.Content);
            var responseContent = (array == null ? (ResponseContent)null : new ResponseContent()
            {
                Info = array.OfType<JsonObject>().Select(o => SimpleJson.DeserializeObject<Info>(o.ToString())).FirstOrDefault(),
                Data = array.OfType<JsonArray>().SelectMany(a => SimpleJson.DeserializeObject<List<IdAndName>>(a.ToString())).ToList()
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多