简体   繁体   中英

Deserializing JSON object throws a Newtonsoft.Json.JsonSerializationException

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM