我正在像这样编写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中有列名,也许这会有所帮助。但是我不明白如何使用自动取款机。有什么建议吗?
您不需要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])
});