【问题标题】:Having a hard time deserializing my JSON string into a .NET object using Newtonsoft.Json很难使用 Newtonsoft.Json 将我的 JSON 字符串反序列化为 .NET 对象
【发布时间】:2013-12-21 15:42:56
【问题描述】:

我绝对不是 JSON 专家。所以,这就是问题所在。我有一个接受 JSON 字符串的 Web 服务方法,我需要将其转换为 .NET 对象。我正在使用 JSON.NET (Newtonsoft.Json)。我很确定我的 JSON 字符串格式不正确 - 我很确定我在某处遗漏了一些括号 - 这是我需要转换为单个 .NET 对象的 JSON:

{'Safety Data': {
    {   
        'unsafe': 'YES',
        'Category Name': 'Body Mechanics',
        'Category Data': 'Grip / Force',
        'Safe': 'NO'
    }, 
    {   
        'unsafe': 'YES',
        'Category Name': 'Position of People',
        'Category Data': 'Falling',
        'Safe': 'NO'

    }, 
    {   
        'unsafe': 'YES',
        'Category Name': 'Position of People',
        'Category Data': 'Other',
        'Safe': 'YES'
    }, 
    'Safe Acts Observed': 'APPLE',
    'Unsafe Acts Observed': 'OK',
    'Date': '11 / 11 / 1988',
    'Observer Name': 'Bob',
    'Observer Group': 'TEST',
    'Location / Area / Region': 'Nowhere',
    'Email': 'abc@abc.com'
}

这是我的 C# 代码:

我尝试过以各种不同的方式更改我的 JSON,但最终我得到了几个不同的错误。对于初学者,我需要知道的是,上面的 JSON 格式是否正确(或不正确),其次,鉴于我上面的 JSON 结构,是否可以将其反序列化为单个 .NET 对象。

【问题讨论】:

  • 不,您的 json 不正确(除了无效字符“和”)。试试this site
  • 您的 json 数据中真的有智能引号吗? ——这是绝对不行的。看来您的代码并非基于您的代码 sn-p。
  • @GaryWalker LOL 不,看看我的代码示例,我用单引号替换了它们。我修改了代码块。
  • -1 停止猜测 - 这是为了您的利益。见jsonlint.comjson.org

标签: c# asp.net json serialization json.net


【解决方案1】:

我认为你在这里遗漏了两件事:

  • 您需要一个代表反序列化对象的 .NET 类(以便 JSON.net 知道要创建哪个类)。您可以使用“粘贴为 json”(编辑-> 选择性粘贴 --> 将 Json 粘贴为类)来生成它(一旦您的 JSOn 正确)。你也可以使用http://json2csharp.com/来生成它。

  • 你的 json 看起来很奇怪。我相信,您在声明 SafetyData 时缺少数组声明 []。此外,正如@L.B 所指出的,您不能在属性名称中包含空格。 (即使用“SafetyData”而不是“Safety Data”)

    {'安全数据': [ { “不安全”:“是”, 'CategoryName': '身体力学', 'CategoryData':'握力/力', “安全”:“否” },

    {
    “不安全”:“是”, 'CategoryName': '人的位置', 'CategoryData': '下降', “安全”:“否” }],

    'SafeActsObserved': 'APPLE', 'UnsafeActsObserved':'OK' }

【讨论】:

  • 谢谢你——帮助了很多人。
  • @MikeMarks 出于好奇:您打算如何处理 json 属性名称中的空格?你对http://json2csharp.com/的输出满意吗
  • 哈哈哈,你说得对!这很有意义 - 需要从属性名称中删除空格。
【解决方案2】:
{
    "Safety Data":
    [
        {
            "unsafe": "YES",
            "Category Name": "Body Mechanics",
            "Category Data": "Grip / Force",
            "Safe": "NO"
        },
        {
            "unsafe": "YES",
            "Category Name": "Position of People",
            "Category Data": "Falling",
            "Safe": "NO"
        },
        {
            "unsafe": "YES",
            "Category Name": "Position of People",
            "Category Data": "Other",
            "Safe": "YES"
        }
    ],
    "Safe Acts Observed":"APPLE",
    "Unsafe Acts Observed": "OK",
    "Date": "11 / 11 / 1988",
    "Observer Name": "Bob",
    "Observer Group": "TEST",
    "Location / Area / Region": "Nowhere",
    "Email": "abc@abc.com"
}

对于 json,您需要双引号而不是单引号,您缺少一个包含 3 个安全数据对象的数组结构,并且您的示例中有不平衡的括号

【讨论】:

    【解决方案3】:

    您的 JSON 仍然无效。如果您访问jsoneditoronline.orgjslint.com,您可以通过粘贴并单击验证按钮来验证您的 json。

    一旦你有有效的 json,如果你想从你的服务器中提取数据,我建议你查看 json.net 的 linq to json 特性(你不需要匹配的类来反序列化)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多