c# - 使用 Newtonsoft 将 JSON 数组反序列化为元组列表

标签 c# arrays json tuples deserialization

我从在线服务提供商那里收到的数据看起来像这样:

{
  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/

相关文章:

java - 如何使可变方法将单个数组作为可变参数数组的第一个值?

arrays - 查找数组的顶部和底部 5 个元素

javascript - Json 字符串转数组(js、jQuery)

json - JQ 选择存在内键的对象

c# - 尝试创建实例应用程序域

c# - MVC Web API 2 中的点字符 '.' 用于 api/people/STAFF.45287 等请求

c# - 获取泛型类的子类型列表

c# - 从 ViewModel 通知用户并取消导航

c - 对 C 中字符串数组的最后一列进行排序

java - Jackson JSON objectmapper 反序列化为 LinkedHashMap 而不是 HashMap