我从在线服务提供商那里收到的数据看起来像这样:
{
name: "test data",
data: [
[ "2017-05-31", 2388.33 ],
[ "2017-04-30", 2358.84 ],
[ "2017-03-31", 2366.82 ],
[ "2017-02-28", 2329.91 ]
],
}
我想将它解析成一个如下所示的对象:
public class TestData
{
public string Name;
public List<Tuple<DateTime, double>> Data;
}
我唯一能找到的是如何将对象数组解析为元组列表,例如:Json.NET deserialization of Tuple<...> inside another type doesn't work?
有没有办法编写一个自定义转换器来处理这个问题?
最佳答案
如果有人对更通用的 ValueTuples 解决方案感兴趣
public class TupleConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var type = value.GetType();
var array = new List<object>();
FieldInfo fieldInfo;
var i = 1;
while ((fieldInfo = type.GetField($"Item{i++}")) != null)
array.Add(fieldInfo.GetValue(value));
serializer.Serialize(writer, array);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var argTypes = objectType.GetGenericArguments();
var array = serializer.Deserialize<JArray>(reader);
var items = array.Select((a, index) => a.ToObject(argTypes[index])).ToArray();
var constructor = objectType.GetConstructor(argTypes);
return constructor.Invoke(items);
}
public override bool CanConvert(Type type)
{
return type.Name.StartsWith("ValueTuple`");
}
}
用法如下:
var settings = new JsonSerializerSettings();
settings.Converters.Add(new TupleConverter());
var list = new List<(DateTime, double)>
{
(DateTime.Now, 7.5)
};
var json = JsonConvert.SerializeObject(list, settings);
var result = JsonConvert.DeserializeObject(json, list.GetType(), settings);
关于c# - 使用 Newtonsoft 将 JSON 数组反序列化为元组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488785/