简体   繁体   English

在C#ASP .NET Core中将JSON反序列化为IEnumerable

[英]Deserialize json to IEnumerable in c# asp .net core

I have a json object. 我有一个JSON对象。 I want to deserialize it to an object of the IEnumerable type. 我想反序列化为IEnumerable类型的对象。

I am working in asp.net Core. 我正在asp.net Core中工作。

I am tried by this: 我受此尝试:

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

Here value is the json variable. 这里的值是json变量。

I got this type of exception: 我有这种类型的异常:

Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (eg {"name":"value"}) into type 'System.Collections.IEnumerable' because the type requires a JSON array (eg [1,2,3]) to deserialize correctly. Newtonsoft.Json.JsonSerializationException:'无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型'System.Collections.IEnumerable',因为该类型需要JSON数组(例如[1,2,3] )正确反序列化。 To fix this error either change the JSON to a JSON array (eg [1,2,3]) or change the deserialized type so that it is a normal .NET type (eg not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. 要解决此错误,可以将JSON更改为JSON数组(例如[1,2,3]),也可以更改反序列化类型,使其成为普通的.NET类型(例如,不像整数这样的原始类型,也不像这样的集合类型)数组或列表),可以从JSON对象反序列化。 JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. 还可以将JsonObjectAttribute添加到类型中,以强制其从JSON对象反序列化。

Json File: Json文件:

{
  "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? 如何解决呢?

1) If your json is an object eg MyUser 1)如果您的json是对象,例如MyUser

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

and your json is 而你的json是

{
   "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. 上面代码中的“数据”是您的json文件数据。

2) If your json is an array of object like eg Array of MyUser. 2)如果您的json是对象数组,例如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 那么您需要IEnumerable类型属性MyUser的视图模型进行反序列化

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. 上面代码中的“数据”是您的json文件数据。

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. A)因为json是键值格式的基于文本的数据,因此您需要一个键才能在JsonConvert类中读取它。

Edited: 编辑:

you please change your json keys like below 您请按如下所示更改json键

{
  "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);

您不能反序列化为接口,只能反序列化为具体类型,例如List of T

您不仅可以反序列化为IEnumerable,还需要一个模型来放入数据。您需要一个能够反映JSON结构的ViewModel,然后可以轻松地反序列化为您的ViewModel类型的IEnumerable。

JsonConvert.DeserializeObject<IEnumerable<SomeViewModel>>(jsonData)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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