使用 RestSharp 反序列化嵌套 JSON 数组
Deserializing nested JSON arrays using RestSharp
我正在尝试使用 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);
我是不是完全遗漏了一些东西,或者我唯一的选择是编写自定义反序列化器 and/or 使用类似 JSON.NET 的东西?
问题是您的 JSON 数组异常多态:它的第一个元素是一个对象,第二个元素是一个对象数组。一种更自然的表示方式是将其表示为具有两个命名属性的 JSON 对象——但这并不是您所获得的。将其直接反序列化为具有两个命名属性的 c# POCO 在单个步骤中 使用任何序列化程序将很棘手,因为 JSON 数据模型与您所需的数据模型完全不同.相反,反序列化为中间表示并进行转换可能是最容易的。幸运的是 RestSharp 有适当的中间 类 JsonObject
and JsonArray
。
因此,如果您想反序列化为以下 类:
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()
});
我正在尝试使用 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);
我是不是完全遗漏了一些东西,或者我唯一的选择是编写自定义反序列化器 and/or 使用类似 JSON.NET 的东西?
问题是您的 JSON 数组异常多态:它的第一个元素是一个对象,第二个元素是一个对象数组。一种更自然的表示方式是将其表示为具有两个命名属性的 JSON 对象——但这并不是您所获得的。将其直接反序列化为具有两个命名属性的 c# POCO 在单个步骤中 使用任何序列化程序将很棘手,因为 JSON 数据模型与您所需的数据模型完全不同.相反,反序列化为中间表示并进行转换可能是最容易的。幸运的是 RestSharp 有适当的中间 类 JsonObject
and JsonArray
。
因此,如果您想反序列化为以下 类:
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()
});