JsonReader如何处理单项与数组

时间:2019-06-17 07:17:25

标签: c# json.net

我正在使用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);

2 个答案:

答案 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

此后,ObjectJToken.ToObject<>强制转换或映射为您想要的指定类型。

JToken