Reputation: 7746
In trying to convert the following json to a DataTable, I get this error:
Error: Newtonsoft.Json.JsonSerializationException: 'Unexpected JSON token when reading DataTable. Expected StartArray, got StartObject. Path '', line 1, position 1.'
var prettyJson = "{
"AAPL": {
"390": [
{
"root": "AAPL",
"expiry": "2024-06-21T00:00:00",
}
]
}
}"
var dt = JsonConvert.DeserializeObject<DataTable>(prettyJson);
Upvotes: 0
Views: 229
Reputation: 43880
you have to flat your json object
DataTable dt = JsonConvert.DeserializeObject<DataTable>(prettyJson, new ToDataTableConverter());
public class ToDataTableConverter : JsonConverter<DataTable>
{
public override DataTable ReadJson(JsonReader reader, Type objectType, DataTable existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var rows = new JArray(JObject.Load(reader).Properties()
.SelectMany(x => GetRows(x.Values())));
return rows.ToObject<DataTable>();
}
private JArray GetRows(IEnumerable<JToken> val)
{
var list = new List<JObject>();
foreach (JProperty jo in val)
{
var key = jo.Name;
foreach (JObject o in jo.Value)
{
o.AddFirst(new JProperty("key", key));
list.Add(o);
}
}
return new JArray(list);
}
public override void WriteJson(JsonWriter writer, DataTable value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanWrite
{
get { return false; }
}
}
output
[{"key":"390","root":"AAPL","expiry":"2024-06-21T00:00:00"}]
Upvotes: 0