如何检查 JSON 输出是否只返回 1 行元素或多行。例如,我有以下 JSON 输出。
{
"orders": {
"order": [
{
"id": 100,
"type": "market",
"symbol": "AAPL",
"side": "buy"
}]
}
}
我有以下代码用于反序列化 JSON 输出:
dynamic dynObj = JsonConvert.DeserializeObject(response);
Console.WriteLine("ID: {0}n Type: {1}n Symbol: {2}n Side: {3}n", dynObj.orders.order.id, dynObj.orders.order.type,dynObj.orders.order.symbol,dynObj.orders.order.side;
但是,大多数时候我将输出作为订单对象数组,如下所示
{
"orders": {
"order": [
{
"id": 101,
"type": "market",
"symbol": "AAPL",
"side": "buy"
},
{
"id": 102,
"type": "market",
"symbol": "MSFT",
"side": "buy"
},
{
"id": 103,
"type": "limit",
"symbol": "AMZN",
"side": "buy"
}
]
}
}
所以我反序列化上面的 Json 输出,如下所示:
dynamic dynObj = JsonConvert.DeserializeObject(response);
foreach (var c in dynObj.orders.order)
{
Console.WriteLine("Id : {0}n", c.id);
Console.WriteLine("Type : {0}n", c.type);
Console.WriteLine("Symbol : {0}n", c.symbol);
Console.WriteLine("Side : {0}n", c.side);
}
我有两个重要的问题:
- 我如何知道返回的 JSON 是否只有 1 行订单对象或集合,以便我可以使用相关方式进行循环。 如果是
数组,我是否需要按如下方式反序列化,如果是,如何我是否将它们添加到订单类/对象?
RootObject ord = JsonConvert.DeserializeObject(response);
任何帮助将不胜感激。
我强烈建议您停止使用dynamic
,因为我认为这是这种类型的滥用。相反,我会定义要反序列化的类型。通过这样做,您可以为自己提供类型安全性,并且处理数据变得微不足道。下面是使用泛型反序列化方法(Deserialize<T>(string input)
)的类定义示例。
public class order
{
public int id { get; set; }
public string type { get; set; }
public string symbol { get; set; }
public string side { get; set; }
}
public class orders
{
List<order> order { get; set; }
}
JsonSerializer serializer = new JsonSerializer();
orders myOrders = serializer.Deserialize<orders>(response);
if (myOrders.order.Count() == 1)
// we have 1 order
能够修复与检查返回的 JSON 结果是对象还是数组有关的问题。修改了我的根对象,它具有数组/对象,如下所示:
[JsonConverter(typeof(GenericListCreationJsonConverter<T>))]
public List<T> order { get; set; }
添加了以下检查 JSON 的类
internal class GenericListCreationJsonConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override bool CanRead
{
get { return true; }
}
public override bool CanWrite
{
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
{
return serializer.Deserialize<List<T>>(reader);
}
else
{
T t = serializer.Deserialize<T>(reader);
return new List<T>(new[] { t });
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}