I have this Json object:
{
"Sheet1": [
{
"one": 1,
"two": 18
},
{
"one": 16,
"two": 33
},
{
"one": 17,
"two": 34
}
]
}
And I am trying to deserialize it using the following model:
public class Sheets
{
[JsonProperty("Sheet1")]
public Sheet Sheet { get; set; }
}
public class Sheet
{
public List<Row> Rows { get; set; }
}
public class Row
{
[JsonProperty("one")]
public string Col1 { get; set; }
[JsonProperty("two")]
public string Col2 { get; set; }
}
var res = JsonConvert.DeserializeObject<Sheets>(result);
but I'm getting this exception:
An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll
Additional information: Cannot deserialize the current JSON array (eg [1,2,3]) into type 'ExcelConsoleApp.Sheet' because the type requires a JSON object (eg {"name":"value"}) to deserialize correctly.
What am I doing wrong? Any thoughts?
EDIT
One possible solution is to use
dynamic dynamicObject = JsonConvert.DeserializeObject(result);
but I want to deserialize it directly into my model.
Sheet1
is not a Sheet type but a List of Rows . This can be identify by brackets.
ie "Sheet1": [
which is a clear sign for Collection and not an Object which is identified by {
.
Change Sheets to the following:
public class Sheets
{
[JsonProperty("Sheet1")]
public List<Row> Sheet { get; set; }
}
this is the model you need, I tested it and it was working exactly as you want. and there is NO need to change the JSON structure.
public class SheetRoot
{
[JsonProperty("Sheet1")]
public List<Row> Sheet { get; set; }
}
public class Row
{
[JsonProperty("one")]
public int Col1 { get; set; }
[JsonProperty("two")]
public int Col2 { get; set; }
}
var res = JsonConvert.DeserializeObject<SheetRoot>(s);
As error shown you should use a list instead of Sheet
class. Try this:
{"Sheets" :
{
"Sheet1": [
{
"one": 1,
"two": 18
},
{
"one": 16,
"two": 33
},
{
"one": 17,
"two": 34
}
]
}
}
Your structures are incompatible.
Inferring from the JSON, the example object can be traversed as Sheet1[i].one
or Sheet1[i].two
. i
being the index. Whereas, the C# model that you have posted will be traversed as SheetsObj.Sheet.Row[i].Col1
.
You could try changing your JSON or model. So, maybe change your JSON to
{
"Sheet1" : {
"Rows": [
{
"one": 1,
"two": 18
},
{
"one": 16,
"two": 33
},
{
"one": 17,
"two": 34
}
]
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.