2017-02-14 89 views
1

我是Newtonsoft.Json的新手,所以请原谅我的无知 - 但是当试图将以下Json反序列化为ac #对象或实际上手动。当返回的值可以是数组或单个项目时,无法反序列化当前的JSON数组

的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. 

我试图把一个[JsonArray]属性的客运班,迫使它deserialise作为一个数组/列表,但同样的错误发生,因为我认为基础项是JProperty而不是JObject。

那么我怎么能得到这个工作,当[“乘客”]可以回来作为一个数组和单个对象?

前进的欢呼声

+0

我建议你使用[Json 2 C#](http://json2csharp.com/)web来生成你的类,或者在Visual Studio中特别粘贴 – Pikoh

+1

显然,travellerInformation对象不可能同时拥有一个乘客属性作为单个实例**和**和数组。我认为在这种情况下我会做的是尝试修改Json(毕竟它是一个字符串),这样乘客属性总是**一个数组。所以找到一种方法来添加方括号,如果需要?下面是Java中的一个答案:http://stackoverflow.com/questions/21063367/jackson-mapping-object-or-list-of-object-depending-on-json-input – Oxonhammer

+0

“Passenger”与错误无关你显示的是与你想要传递给TraverInfo对象的TraverInfo数组有关 - 除此之外,如果你控制创建数据,则将乘客改为始终为1或1的数组更多条目。如果没有,你可以在脚本端编写一个映射器来“修复”,在发送之前将单个对象封装到一个数组中? – Nope

回答

0

试试这个。与object passengerTravellerInformation更换List<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); 

而且对于这些情况下,您可以使用此service自动从JSON对象创建C#类,所以你不必担心正确性。

+0

我没有使用Json 2 C#来创建类 - 但是,为了提出这个问题,我只显示了导致问题的特定部分。在Json顶部有一个[“response”]元素 - 对不起,如果这造成一些混淆 –

+0

感谢您选择列表 - 我没有意识到这也可能是一个数组或单个项目Json。所以我将它更改为Response类中的List - 并且似乎已经解决了这个问题,但现在错误是特定于列表仍然 - 我尝试更改该对象,但出现同样的错误 –

+0

对不起,无法理解最后一句话。剩余的问题是要检测'object'的类型是'List '还是'Passenger'以转换成它?如果是的话,那么我认为我有一个解决方案 –

0

您可以尝试将它反序列化为dynamic,然后对类型进行一些检查。检查它是否is IEnumerable

这应该做的工作。

相关问题