我正在使用JSON .NET解析从Web服务接收到的响应。
问题是响应可能包含单个项目,也可能包含多个项目(数组),这将导致响应字符串略有不同。

单项回应:

{
    "row": "1",
    "name": "John"
}


多项回应:

[
    {
        "row": "1",
        "name": "John"
    },
    {
        "row": "2",
        "name": "Doe"
    },
]


我正在使用以下代码进行解析

 List<MyClass> wsRetrieveDataResponse = JsonReadSerializer.Deserialize<List<MyClass>>(reader);


这里的问题是,由于它使用的是List<MyClass>,因此它期望一个数组,并且如果Web服务响应是单个项目,则将引发错误。如何处理这两种情况?

[编辑]:JsonReadSerializer具有JsonSerializer类型,它是JSON.NET的一部分。反序列化是JSON.NET函数。
我只是添加一些构造函数来处理某些情况。代码如下。

public static JsonSerializer JsonReadSerializer;


JsonReadSerializer的构造方法

JsonReadSerializer = new JsonSerializer()
{
    MissingMemberHandling = JSON_ENFORCE_MISSING ? MissingMemberHandling.Error : MissingMemberHandling.Ignore,
    NullValueHandling = JSON_NULL_IGNORE ? NullValueHandling.Ignore : NullValueHandling.Include
 };


[EDIT#2]:我的回复使用类型JsonTextReader

// Get the response.
...
WebResponse response = webRequest.GetResponse();
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);

return new JsonTextReader(reader);

最佳答案

您可以使用JTokenType提供的Newtonsoft.Json.Linq枚举检查json的类型。

首先尝试使用JToken提供的JsonTextReader方法用.Load加载JToken,然后检查解析的JTokenArray还是Object

之后,将JToken.ToObject<>强制转换或映射为要指定的指定类型。

JToken jToken = JToken.Load(reader);

if (jToken.Type == JTokenType.Array)
{
    List<MyClass> wsRetrieveDataResponse = jToken.ToObject<List<MyClass>>();
}
else if (jToken.Type == JTokenType.Object)
{
    MyClass wsRetrieveDataResponse = jToken.ToObject<MyClass>();
}

10-08 14:21