用于过滤器的JSON的Newtonsoft Json转换器

问题描述 投票:0回答:1

我正在像这样编写json转换器:

{
    "datatable": {
        "data": [
            [
                "A85002072C",
                "1994-11-15",
                678.9
            ]
        ],
        "columns": [
            {
                "name": "series_id",
                "type": "String"
            },
            {
                "name": "date",
                "type": "Date"
            },
            {
                "name": "value",
                "type": "double"
            }
        ]
    },
    "meta": {
        "next_cursor_id": null
    }
}

此刻我的转换器看起来像这样:

    public class AbsToModelConverter : JsonConverter
    {

        public override bool CanConvert(Type objectType)
        {
            return objectType.Name.Equals("AbsFseModel");
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {

            JArray array = JArray.Load(reader);
            return new QuandlAbsModel
            {
                SeriesId = array[0].ToString(),
                Date = array[1].ToObject<DateTime>(),
                Value = array[2].ToObject<decimal?>()
            };
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var orderItem = value as QuandlAbsModel;
            JArray arra = new JArray();
            arra.Add(orderItem.SeriesId);
            arra.Add(orderItem.Date);
            arra.Add(orderItem.Value);

            arra.WriteTo(writer);
        }
    }

目前,它可以工作,但是当我使用过滤器时,我的json可能包含不完整的数据,例如:

"data":[["1994-11-15",678.9]]

并且我的JsonConverter停止工作,因为没有元素array [2]并引发错误。问题是数据数组中的元素没有名称(我从Web API获取JSON,所以我根本无法更改JSON)。有什么方法可以使我的转换器使用过滤器反序列化json吗?

我在数据表后的json中有列名,也许这会有所帮助。但是我不明白如何使用自动取款机。有什么建议吗?

c# json json.net converters
1个回答
0
投票

您不需要JsonConverter

定义类以表示所需的JSON部分:

class APIResponse
{
    public DataTable DataTable { get; set; }
}

class DataTable
{
    public object[][] Data { get; set; }
}

使用JsonConvert.DeserializeObject<T>()反序列化JSON:

var parsed = JsonConvert.DeserializeObject<APIResponse>(json);

然后获取您的值:

var rows = parsed.DataTable.Data.Select(r => new QuandLabsModel
{
    SeriesId = Convert.ToString(r[0]),
    Date = Convert.ToDateTime(r[1]),
    Value = Convert.ToDecimal(r[2])
});
© www.soinside.com 2019 - 2024. All rights reserved.