为了账号安全,请及时绑定邮箱和手机立即绑定

在 c# asp .net core 中将 json 反序列化为 IEnumerable

在 c# asp .net core 中将 json 反序列化为 IEnumerable

C#
人到中年有点甜 2021-10-09 16:23:13
我有一个 json 对象。我想将它反序列化为该IEnumerable类型的对象。我在asp.net Core 工作。我是这样尝试的:IEnumerable div = (IEnumerable)JsonConvert.DeserializeObject(value, typeof(IEnumerable));这里的值是 json 变量。我得到了这种类型的异常:Newtonsoft.Json.JsonSerializationException: '无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型'System.Collections.IEnumerable',因为该类型需要一个 JSON 数组(例如 [1,2,3] ) 以正确反序列化。要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型)可以从 JSON 对象反序列化的数组或列表)。JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

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


查看完整回答
反对 回复 2021-10-09
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2021-10-09
?
森栏

TA贡献1810条经验 获得超5个赞

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


查看完整回答
反对 回复 2021-10-09
  • 3 回答
  • 0 关注
  • 455 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信