我正在使用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服务响应是单个项目,则将引发错误。如何处理这两种情况?
[EDIT]: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);
答案 0 :(得分:4)
您可以使用这种类型的东西:
var token = JToken.Parse(content);
if (token is JArray)
{
IEnumerable<MyClass> response= token.ToObject<List<MyClass>>();
}
else if (token is JObject)
{
MyClass myClass= token.ToObject<MyClass>();
}
答案 1 :(得分:2)
您可以使用JTokenType
提供的Newtonsoft.Json.Linq
枚举检查json的类型
首先尝试使用JToken
提供的JsonTextReader
方法将.Load
装入JToken
,然后检查解析的JToken
是否为{{1 }}或Array
。
此后,Object
将JToken.ToObject<>
强制转换或映射为您想要的指定类型。
JToken