【问题标题】:Deserialize JSON to c# model将 JSON 反序列化为 c# 模型
【发布时间】:2020-01-27 21:36:38
【问题描述】:

我收到一个像

这样的 json 对象
 {
    "designKey": 7470,
    "title": "Test1",
    "note": "Test1",
    "createdBy": "username",
    "creationDate": "2020-01-24T20:47:28.297"   },  
 {
    "designKey": 7472,
    "title": "Test2",
    "note": "Test2",
    "createdBy": "username",
    "creationDate": "2020-01-24T23:20:44.207"   },   
 {
    "designKey": 7473,
    "title": "Test3",
    "note": "Test3",
    "createdBy": "username",
    "creationDate": "2020-01-24T23:39:03.99"   }

所以我创建模型来反序列化:

public class AssignDesignModel
    {
        public class DesignViewModel
        {
            public IList<DesignAssignViewModel> DesignAssignList { get; set; } = new List<DesignAssignViewModel>();
        }

        public class DesignAssignViewModel
        {
            public int DesignKey { get; set; }
            public string Title { get; set; }
            public string Note { get; set; }
            public string CreatedBy { get; set; }
            public DateTime CreationDate { get; set; }
        }
    }

我执行为:

 var rModel = JsonConvert.DeserializeObject<DesignViewModel>(response.content);

但它会抛出异常:

Newtonsoft.Json.JsonSerializationException: '无法反序列化 当前 JSON 数组(例如 [1,2,3])转换为类型 'Project.Models.AssignDesignModel+DesignViewModel' 因为类型 需要一个 JSON 对象(例如 {"name":"value"})来反序列化 正确。要修复此错误,请将 JSON 更改为 JSON 对象 (例如 {"name":"value"}) 或将反序列化类型更改为数组或 实现集合接口的类型(例如 ICollection, IList),例如可以从 JSON 数组反序列化的 List。 JsonArrayAttribute 也可以添加到类型中以强制它 从 JSON 数组反序列化。路径'',第 1 行,位置 1。'

我搜索了类似的问题,但找不到解决方案。问候

【问题讨论】:

  • JsonConvert.DeserializeObject&lt;DesignAssignViewModel[]&gt; 或者如果您想要JsonConvert.DeserializeObject&lt;DesignViewModel&gt;,请确保您的 json 字符串具有对象格式,该格式具有包含 DesignViewModel 对象数组的属性 DesignAssignList
  • 在你的 json 中创建对象数组并按照@RezaAghaei 所说的去做。
  • @RezaAghaei 这不是很有帮助。
  • @user1538301 如我所见,您的 json 未形成为数组。您应该添加 [ ] 像 [{"prop1":""},{"prop2":""}]
  • 您的 json 无效.....您需要有效的 json。到jsonlint.com 并在那里发布你的 json 以确保它是有效的

标签: c# json json-deserialization


【解决方案1】:

按照您现在定义 DesignViewModel 的方式,您的 JSON 必须如下所示:

{
    "DesignAssignList": [
        {
            "designKey": 7470,
            "title": "Test1",
            "note": "Test1",
            "createdBy": "username",
            "creationDate": "2020-01-24T20:47:28.297"
        },
        {
            "designKey": 7472,
            "title": "Test2",
            "note": "Test2",
            "createdBy": "username",
            "creationDate": "2020-01-24T23:20:44.207"
        },
        {
            "designKey": 7473,
            "title": "Test3",
            "note": "Test3",
            "createdBy": "username",
            "creationDate": "2020-01-24T23:39:03.99"
        }
    ]
}

【讨论】:

  • 好点,但不太可能更改传入 JSON 的格式。
  • @pseudocoder 我希望它是......发布的 JSON OP 不是 JSON 哈哈。 (编辑:虽然,总的来说,我确实同意你的说法,但我认为值得启发 OP 关于 为什么 他所做的事情不起作用,这可能只是一个简单的“Doh!”几年前我第一次使用 ASP.NET 遇到这个问题时,对他们来说也是如此)
  • 完全正确,我的模型结构很糟糕...我只是更改删除 DesignAssignViewModel 并移动到 DesignViewModel 然后将反序列化模型更改为 IList 为:` var rModel = JsonConvert.DeserializeObject >(response.content);`谢谢!
  • @Lion 听起来你使用了我的答案并接受了这个!
  • @pseudocoder 我不得不猜测,因为虽然您的答案解决了问题,但我的答案以一种允许 OP 无需复制任何代码即可到达的方式来解释解决方案;他现在可以理解使用您的解决方案、我的解决方案或任何其他涉及更改其输入或预期数据模型的建议解决方案。
【解决方案2】:

我会删除AssignDesignModelDesignViewModel,因为它们不是必需的。 JSON 文件(几乎)包含您定义为 class DesignAssignViewModel 的对象数组,所以我会这样调用反序列化:

型号:

public class DesignAssignViewModel
        {
            public int DesignKey { get; set; }
            public string Title { get; set; }
            public string Note { get; set; }
            public string CreatedBy { get; set; }
            public DateTime CreationDate { get; set; }
        }

反序列化:

var rModel = JsonConvert.DeserializeObject&lt;DesignAssignViewModel[]&gt;(response.content);

也就是说,传入的 JSON 格式不正确,正如其他人所指出的那样。因此,您可能应该首先处理该问题。

【讨论】:

  • 老实说,如果您在答案中发布您推荐的代码更改以供 OP 查看,我会给您投票;这是当前问题的唯一其他可接受的解决方案。 (ETA:已经放弃投票。请更新答案以获得更好的质量)
  • 发布的json不是数组...它甚至不是有效的json
  • @Darkonekt 我们知道。通常,当人们发布无效的 JSON 时,我会推断原始 JSON 必须是什么,因为任何处理 JSON 的人都应该知道,如果它无法解析,它将无法工作。基于这个问题,必须在某处使用正确的 JSON,否则 OP 将无法达到他所拥有的程度(他会得到语法错误而不是转换错误)。但是您是 100% 正确的,我不会让无效的 JSON 阻止您提供 OP 可能从中学到的答案(OP 学到的教训不是编写有效的 JSON,这是他应用程序运行时的教训会教他)
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
相关资源
最近更新 更多