我正在使用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
,然后检查解析的JToken
是Array
还是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>();
}