我是Newtonsoft.Json的新手,所以请原谅我的无知 - 但是在尝试将以下Json反序列化为c#对象或手动时,我遇到了这个问题。
Json是
{
"travellerInfo": [
{
"passengerData": {
"travellerInformation": {
"passenger": [
{
"type": "ADT",
"firstName": "MARY MRS"
},
{
"type": "INF",
"firstName": "JOSHUA"
}
],
"traveller": {
"surname": "SMITH",
"quantity": "2"
}
}
}
},
{
"passengerData": {
"travellerInformation": {
"passenger": {
"type": "ADT",
"firstName": "JOHN MR"
},
"traveller": {
"surname": "SMITH",
"quantity": "1"
}
}
}
}
]
}
如您所见,在第一个"乘客"项上,它作为数组返回,但是在第二个"乘客"项上,它不作为数组返回,只是一个块。 我无法控制发送给我的 Json - 它来自外部系统。 我的 C# 类是
public class Passenger
{
public string type { get; set; }
public string firstName { get; set; }
}
public class Traveller
{
public string surname { get; set; }
public string quantity { get; set; }
}
public class TravellerInformation
{
public List<Passenger> passenger { get; set; }
public Traveller traveller { get; set; }
}
public class PassengerData
{
public TravellerInformation travellerInformation { get; set; }
}
public class TravellerInfo
{
public PassengerData passengerData { get; set; }
}
我打电话
var example = JsonConvert.DeserializeObject<TravellerInfo>(jsonString);
我收到错误
Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Script1.TravellerInfo' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path 'travellerInfo', line 57, position 20.
我尝试在 Passenger 类上放置一个 [JsonArray] 属性以强制它反序列化为数组/列表,但发生了同样的错误,因为我认为底层项目是 JProperty 而不是 JObject。
那么,当 ["乘客"] 可以同时作为数组和单个对象返回时,我如何让它工作?
提前欢呼
您可以尝试将其反序列化为 dynamic
,然后对类型进行一些检查。检查是否is IEnumerable
。
这应该可以完成这项工作。
试试这个。将List<Passenger>
替换为TravellerInformation
中的object passenger
:
public class Traveller
{
public string surname { get; set; }
public string quantity { get; set; }
}
public class TravellerInformation
{
public object passenger { get; set; }
public Traveller traveller { get; set; }
}
public class PassengerData
{
public TravellerInformation travellerInformation { get; set; }
}
public class TravellerInfo
{
public PassengerData passengerData { get; set; }
}
并通过传递List<TravellerInfo>
而不是TravellerInfo
来调用它:
var example = JsonConvert.DeserializeObject<List<TravellerInfo>>(jsonString);
此外,对于这些情况,您可以使用此服务,该服务会自动从 JSON 对象创建 C# 类,因此您不必担心正确性。