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

时间:2018-07-16 09:52:14

标签: c# json asp.net-core deserialization json-deserialization

我有一个json对象。我想将其反序列化为_gitIgnoreTemplateNames.map((templateName) => DropdownMenuItem( child Text(templateName), value: templateName) ).toList() 类型的对象。

我正在asp.net Core中工作。

我被这个尝试了

IEnumerable

这里的值是json变量。

我遇到这种例外情况:

  

Newtonsoft.Json.JsonSerializationException:'无法反序列化当前JSON对象(例如{“ name”:“ value”})为type   'System.Collections.IEnumerable',因为类型需要JSON   数组(例如[1,2,3])正确反序列化。       要解决此错误,可以将JSON更改为JSON数组(例如[1,2,3]),也可以更改反序列化类型,使其成为普通的.NET。   类型(例如,不是整数之类的原始类型,不是集合类型   (例如数组或列表),可以从JSON对象反序列化。   还可以将JsonObjectAttribute添加到类型中以强制其   从JSON对象反序列化。

Json文件:

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

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

1)如果您的json是一个对象     例如MyUser

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

您的json是

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

然后您可以使用以下代码轻松地反序列化

MyUser user = JsonConvert.DeserializeObject<MyUser>(data);
上面代码中的

“数据”是您的json文件数据。

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"}
  ]
}

然后,您需要IEnumerable类型属性MyUser的视图模型来像

一样反序列化
public class MyUserVM
{
    public IEnumerable<MyUser> Users { get; set; }
}

,然后您需要使用上述视图模型进行反序列化

MyUserVM users = JsonConvert.DeserializeObject<MyUserVM>(data);
上面代码中的

“数据”是您的json文件数据。

Q)为什么在这里需要视图模型?

A)因为json是键值格式的文本数据,因此您需要一个键才能在JsonConvert类中读取它。

已编辑:

请按如下所示更改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"
    }
  ]
}

并使用下面为我创建的视图模型

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; }
}

,然后使用进行反序列化

RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(data);

答案 1 :(得分:0)

您不能反序列化为接口,只能反序列化为诸如T列表之类的具体类型

答案 2 :(得分:0)

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

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