不同格式 JSON 反序列化为对象
Different format JSON deserializing to object
我有一个从 Poloniex 的 API 收到的数据内存流。
https://docs.poloniex.com/#ticker-data
API 中的数据格式如下:
[
1002,
null,
[
149,
"382.98901522",
"381.99755898",
"379.41296309",
"-0.04312950",
"14969820.94951828",
"38859.58435407",
0,
"412.25844455",
"364.56122072",
0,
0
]
]
我可以看到这是有效的 json https://jsonlint.com/
我的最终目标是将其反序列化为 C# 中的一个对象,我可以将其发送到其他地方。
我以前从未见过这样的 JSON,不确定如何将此结构反序列化到我自己的模型中。我习惯将 JSON 视为 keyvaluepairs
我已经反序列化为 JArray 并从那里开始,但我不确定最佳方法。
var deserialized =
(JArray)_serializer.Deserialize(new JsonTextReader(new StreamReader(stream))
{
CloseInput = false
});
最好的方法是什么?
要反序列化为的示例模型结构:
public class PoloniexResponseDataRoot
{
public List<PoloniexResponseDataParent> Children { get; set; }
}
public class PoloniexResponseDataParent
{
public int ChannelNumber { get; set; }
public int? OtherNumber { get; set; }
public List<PoloniexResponseDataChild> Children { get; set; }
}
public class PoloniexResponseDataChild
{
public object Data { get; set; }
}
谢谢
这个 JSON 基本上是一个对象数组。
List<object> items = _serializer.Deserialize<List<object>>(jsonString);
然后您可以创建一个新的 class 并将该对象分配给 class
或者简单地使用它。
如果您的结构与示例中的结构一样简单,并且前 2 个数字始终代表 ChannelNumber
和 OtherNumber
,后跟 1 级数组,那么您可以这样做:
private static PoloniexResponseDataParent Parse(JArray objects)
{
var parent = new PoloniexResponseDataParent();
var channelNumber = objects[0];
var otherNumber = objects[1];
var children = objects[2];
parent.ChannelNumber = Convert.ToInt32(channelNumber);
parent.OtherNumber = (otherNumber as JValue).Value<int?>();
parent.Children = children.Select(item => new PoloniexResponseDataChild
{
Data = item switch
{
JValue jValue => jValue.Value,
_ => throw new ArgumentOutOfRangeException(nameof(item))
}
}).ToList();
return parent;
}
var jArray = Newtonsoft.Json.JsonConvert.DeserializeObject<JArray>(jsonStr);
var parent = Parse(jArray);
我有一个从 Poloniex 的 API 收到的数据内存流。 https://docs.poloniex.com/#ticker-data
API 中的数据格式如下:
[
1002,
null,
[
149,
"382.98901522",
"381.99755898",
"379.41296309",
"-0.04312950",
"14969820.94951828",
"38859.58435407",
0,
"412.25844455",
"364.56122072",
0,
0
]
]
我可以看到这是有效的 json https://jsonlint.com/
我的最终目标是将其反序列化为 C# 中的一个对象,我可以将其发送到其他地方。
我以前从未见过这样的 JSON,不确定如何将此结构反序列化到我自己的模型中。我习惯将 JSON 视为 keyvaluepairs
我已经反序列化为 JArray 并从那里开始,但我不确定最佳方法。
var deserialized =
(JArray)_serializer.Deserialize(new JsonTextReader(new StreamReader(stream))
{
CloseInput = false
});
最好的方法是什么?
要反序列化为的示例模型结构:
public class PoloniexResponseDataRoot
{
public List<PoloniexResponseDataParent> Children { get; set; }
}
public class PoloniexResponseDataParent
{
public int ChannelNumber { get; set; }
public int? OtherNumber { get; set; }
public List<PoloniexResponseDataChild> Children { get; set; }
}
public class PoloniexResponseDataChild
{
public object Data { get; set; }
}
谢谢
这个 JSON 基本上是一个对象数组。
List<object> items = _serializer.Deserialize<List<object>>(jsonString);
然后您可以创建一个新的 class 并将该对象分配给 class 或者简单地使用它。
如果您的结构与示例中的结构一样简单,并且前 2 个数字始终代表 ChannelNumber
和 OtherNumber
,后跟 1 级数组,那么您可以这样做:
private static PoloniexResponseDataParent Parse(JArray objects)
{
var parent = new PoloniexResponseDataParent();
var channelNumber = objects[0];
var otherNumber = objects[1];
var children = objects[2];
parent.ChannelNumber = Convert.ToInt32(channelNumber);
parent.OtherNumber = (otherNumber as JValue).Value<int?>();
parent.Children = children.Select(item => new PoloniexResponseDataChild
{
Data = item switch
{
JValue jValue => jValue.Value,
_ => throw new ArgumentOutOfRangeException(nameof(item))
}
}).ToList();
return parent;
}
var jArray = Newtonsoft.Json.JsonConvert.DeserializeObject<JArray>(jsonStr);
var parent = Parse(jArray);