0

I have a json object. I want to deserialize it to an object of the IEnumerable type.

I am working in asp.net Core.

I am tried by this:

IEnumerable div = (IEnumerable)JsonConvert.DeserializeObject(value, typeof(IEnumerable));

Here value is the json variable.

I got this type of exception:

Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.IEnumerable' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.

Json File:

{
  "name": "xx",
  "place": {
    "native": "aa",
    "school": "ee",
    "college": "dd"
  },
  "dob": "ss",
  "ids": [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18,
    19,
    20,
    21,
    22,
    23,
    24,
    25,
    26,
    27,
    28,
    29,
    30,
    31,
    32,
    33,
    34,
    35,
    36,
    37,
    38,
    39,
    40,
    41,
    42,
    43,
    44,
    45,
    46,
    47,
    48,
    49,
    50,
    51,
    52,
    53,
    54,
    55,
    56,
    57,
    58,
    59,
    60,
    61,
    62,
    63,
    64,
    65,
    66,
    67,
    68,
    69,
    70,
    71,
    72,
    73,
    74,
    75,
    76,
    77,
    78,
    79,
    80,
    81,
    82,
    83,
    84,
    85,
    86,
    87,
    88,
    89,
    90,
    91,
    92,
    93,
    94,
    95,
    96,
    97,
    98,
    99,
    100,
    101,
    102,
    103,
    104,
    105,
    106,
    107,
    108,
    109,
    110,
    111,
    112,
    113,
    114,
    115,
    116,
    117,
    118,
    119,
    120
  ],
  "mark": [
    {
      "10thmark": "345",
      "12thmark": "1100"
    },
    {
      "Diploma": "G",
      "Diploma PG": "R"
    },
    {
      "Ug": "D",
      "PG": "E"
    }
  ]
}

How to resolve this?

mjwills
  • 23,389
  • 6
  • 40
  • 63
  • If the JSON string contains an array the result will be an array. No need to specify the `IEnumerable` type. – Panagiotis Kanavos Jul 16 '18 at 09:59
  • Please provide code and the JSON if it is still not fixed. – Jyothish Bhaskaran Jul 16 '18 at 10:01
  • If your input contains one object per line without brackets it's *NOT* a valid JSON file. You shouldn't try to deserialize all of it at once. This form is meant to stream large numbers of objects without requiring the entire string to be read. Read and parse one line at a time instead. – Panagiotis Kanavos Jul 16 '18 at 10:04
  • @JyothishBhaskaran, I attached the Json file. Please refer above. – Nivitha Gopalakrishnan Jul 16 '18 at 11:29
  • @Nivitha Gopalakrishnan , you cannot deserialize it directly with IEnumrable, if you closely look your json its an key value pair and you need a view model, for such please see my answer it may help you – er-sho Jul 16 '18 at 11:35
  • @Nivitha Gopalakrishnan, you just put your json and create view model as json look like then you will be able to deserialize correctly – er-sho Jul 16 '18 at 11:38
  • I think you can'd directly achieve this. I faced one issue similar to this few months ago. Please see this link. https://stackoverflow.com/questions/49895597/error-in-deserialising-the-objects – Jyothish Bhaskaran Jul 16 '18 at 15:09

3 Answers3

2

1) If your json is an object e.g. MyUser

public class MyUser
{
    public int Id { get; set; }    
    public string Name { get; set; }    
    public string Description { get; set; }
}

and your json is

{
   "Id": 1,
   "Name": "Andrew",
   "Description": "Software Engineer"
}

then you easily deserialize by using below code

MyUser user = JsonConvert.DeserializeObject<MyUser>(data);

"data" in above code is your json file data.

2) If your json is an array of object like e.g. Array of MyUser.

{
  "Users": [
    { "Id": 1, "Name": "Andrew", "Description": "Software Engineer"},
    { "Id": 2, "Name": "Eddy", "Description": "Software Developer"},
    { "Id": 3, "Name": "Matthew", "Description": "Web Developer"}
  ]
}

then you need a view model of IEnumerable type property MyUser to deserialize like

public class MyUserVM
{
    public IEnumerable<MyUser> Users { get; set; }
}

and then you need to deserialize by using above view model like

MyUserVM users = JsonConvert.DeserializeObject<MyUserVM>(data);

"data" in above code is your json file data.

Q) Why the need of view model here?

A) Because json is an key value format text based data and you need a key to read it in JsonConvert class.

Edited:

you please change your json keys like below

{
  "name": "xx",
  "place": {
    "native": "aa",
    "school": "ee",
    "college": "dd"
  },
  "dob": "ss",
  "ids": [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18,
    19,
    20,
    21,
    22,
    23,
    24,
    25,
    26,
    27,
    28,
    29,
    30,
    31,
    32,
    33,
    34,
    35,
    36,
    37,
    38,
    39,
    40,
    41,
    42,
    43,
    44,
    45,
    46,
    47,
    48,
    49,
    50,
    51,
    52,
    53,
    54,
    55,
    56,
    57,
    58,
    59,
    60,
    61,
    62,
    63,
    64,
    65,
    66,
    67,
    68,
    69,
    70,
    71,
    72,
    73,
    74,
    75,
    76,
    77,
    78,
    79,
    80,
    81,
    82,
    83,
    84,
    85,
    86,
    87,
    88,
    89,
    90,
    91,
    92,
    93,
    94,
    95,
    96,
    97,
    98,
    99,
    100,
    101,
    102,
    103,
    104,
    105,
    106,
    107,
    108,
    109,
    110,
    111,
    112,
    113,
    114,
    115,
    116,
    117,
    118,
    119,
    120
  ],
  "mark": [
    {
      "tenthmark": "345",
      "twelthmark": "1100"
    },
    {
      "Diploma": "G",
      "DiplomaPG": "R"
    },
    {
      "Ug": "D",
      "PG": "E"
    }
  ]
}

and use below view models that i created for you

public class Place
{
    public string native { get; set; }
    public string school { get; set; }
    public string college { get; set; }
}

public class Mark
{
    public string tenthmark { get; set; }
    public string twelthmark { get; set; }
    public string Diploma { get; set; }
    public string DiplomaPG { get; set; }
    public string Ug { get; set; }
    public string PG { get; set; }
}

public class RootObject
{
    public string name { get; set; }
    public Place place { get; set; }
    public string dob { get; set; }
    public List<int> ids { get; set; }
    public List<Mark> mark { get; set; }
}

and then deserialize by using

RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(data);
er-sho
  • 9,581
  • 2
  • 13
  • 26
  • public class MyUserVM { public IEnumerable Users { get; set; } } MyUserVM users = JsonConvert.DeserializeObject(value); – Nivitha Gopalakrishnan Jul 16 '18 at 11:42
  • @Nivitha Gopalakrishnan, could you please rename some properties like "10thmark" or "12thmark" to pure strings and "Diploma PG" with no space. and try again – er-sho Jul 16 '18 at 12:10
0

You cannot deserialize to an interface, you can only deserialize to a concrete type like List of T

Joe Audette
  • 35,330
  • 11
  • 106
  • 99
0

You can't just deserialize to IEnumerable... you need a model to put the data in. You need a ViewModel that reflects your JSON structure, and then you can easily deserialize to an IEnumerable of your ViewModel type.

JsonConvert.DeserializeObject<IEnumerable<SomeViewModel>>(jsonData)
Brad
  • 323
  • 2
  • 13