【问题标题】:Deserialize json to IEnumerable in c# asp .net core在c#asp .net核心中将json反序列化为IEnumerable
【发布时间】:2018-07-19 23:17:18
【问题描述】:

我有一个 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 对象反序列化。

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

如何解决?

【问题讨论】:

  • 如果 JSON 字符串包含一个数组,则结果将是一个数组。无需指定IEnumerable 类型。
  • 如果仍未修复,请提供代码和JSON。
  • 如果您的输入每行包含一个不带括号的对象,则它 NOT 是一个有效的 JSON 文件。您不应该尝试一次反序列化所有内容。这种形式旨在流式传输大量对象,而无需读取整个字符串。而是一次读取和解析一行。
  • @JyothishBhaskaran,我附上了 Json 文件。请参考以上内容。
  • @Nivitha Gopalakrishnan ,你不能直接用 IEnumrable 反序列化它,如果你仔细看看你的 json 它是一个键值对并且你需要一个视图模型,请看我的回答它可能对你有帮助跨度>

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


【解决方案1】:

1) 如果你的 json 是一个对象 例如我的用户

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

上面代码中的“data”是你的json文件数据。

2) 如果您的 json 是一个对象数组,例如 例如我的用户数组。

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

上面代码中的“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);

【讨论】:

  • public class MyUserVM { public IEnumerable Users { get;放; } } MyUserVM 用户 = JsonConvert.DeserializeObject(value);
  • @Nivitha Gopalakrishnan,您能否将一些属性如“10thmark”或“12thmark”重命名为纯字符串和“Diploma PG”,没有空格。再试一次
【解决方案2】:

你不能反序列化到一个接口,你只能反序列化到一个具体的类型,比如 List of T

【讨论】:

  • 这不是真的 - 你可以反序列化到一个接口,你只需要一个自定义转换器来处理它。
【解决方案3】:

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

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

【讨论】:

  • 解释一下会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 2017-09-24
  • 1970-01-01
  • 2015-09-20
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多