I have a JSON string that I'm trying to deserialize into a list of the following class:
public class Selection
{
public Int64 id { get; set; }
public bool view { get; set; }
public bool edit { get; set; }
public bool broad { get; set; }
}
This is my JSON string that I get:
[
[
{"name":"id", "value":0},
{"name":"view", "value":true},
{"name":"edit", "value":false},
{"name":"broad", "value":false}
],
[
{"name":"id", "value":0},
{"name":"view", "value":false},
{"name":"edit", "value":false},
{"name":"broad", "value":false}
],
[
{"name":"id", "value":0},
{"name":"view", "value":true},
{"name":"edit", "value":false},
{"name":"broad", "value":false}
],
[
{"name":"id", "value":0},
{"name":"view", "value":true},
{"name":"edit", "value":false},
{"name":"broad", "value":false}
],
[
{"name":"id", "value":0},
{"name":"view", "value":false},
{"name":"edit", "value":false},
{"name":"broad", "value":false}
],
[
{"name":"id", "value":0},
{"name":"view", "value":false},
{"name":"edit", "value":false},
{"name":"broad", "value":false}
],
[
{"name":"id", "value":0},
{"name":"view", "value":false},
{"name":"edit", "value":false},
{"name":"broad", "value":false}
],
[
{"name":"id", "value":0},
{"name":"view", "value":false},
{"name":"edit", "value":false},
{"name":"broad", "value":false}
],
[
{"name":"id", "value":0},
{"name":"view", "value":false},
{"name":"edit", "value":false},
{"name":"broad", "value":false}
],
[
{"name":"id", "value":0},
{"name":"view", "value":false},
{"name":"edit", "value":false},
{"name":"broad", "value":false}
]
]
This is how I'm calling deserialization:
var selection = JsonConvert.DeserializeObject<List<Selection>>(param.selection);
But I'm getting this error:
Do I need another type of format?
You are getting this error because the shape of the JSON does not match the structure you are trying to deserialize into. Your JSON represents an array of arrays of name-value pair objects, but you are trying to deserialize into a List<Selection>
. To deserialize into the class you have defined, you will need to use a custom JsonConverter
like this:
public class SelectionConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Selection);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var obj = new JObject(
JArray.Load(reader)
.Children<JObject>()
.Select(jo => new JProperty((string)jo["name"], jo["value"]))
);
var selection = new Selection();
serializer.Populate(obj.CreateReader(), selection);
return selection;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Then, you can deserialize like this:
var selection = JsonConvert.DeserializeObject<List<Selection>>(param.selection, new SelectionConverter());
Fiddle: https://dotnetfiddle.net/pgAvUA