小编典典

将JSON反序列化为C#类

c#

以下是成功创建新的“工作代码”条目后从REST API获得的(略)简化的响应。我需要将响应反序列化为某些类,但是我很困惑。

作为参考,我在.NET 3.5(在SQL Server 2008 R2中的SSIS脚本中运行)中使用JSON.NET尝试反序列化。这是JSON-
我显然无法控制它,因为它来自其他人的API:

{
   "results":{
      "jobcodes":{
         "1":{
            "_status_code":200,
            "_status_message":"Created",
            "id":444444444,
            "assigned_to_all":false,
            "billable":true,
            "active":true,
            "type":"regular",
            "name":"1234 Main Street - Jackson"
         },
         "2":{
            "_status_code":200,
            "_status_message":"Created",
            "id":1234567890,
            "assigned_to_all":false,
            "billable":true,
            "active":true,
            "type":"regular",
            "name":"4321 Some Other Street - Jackson"
         }
      }
   }
}

在我的C#代码中,我确实定义了一个“ JobCode”类,该类仅将JSON值部分映射到属性-我对返回给我的所有数据不感兴趣:

[JsonObject]
class JobCode
{
    [JsonProperty("_status_code")]
    public string StatusCode { get; set; }
    [JsonProperty("_status_message")]
    public string StatusMessage { get; set; }
    [JsonProperty("id")]
    public string Id {get; set;}
    [JsonProperty("name")]
    public string Name { get; set; }

    //-------------------------------------------------------------------------------
    // Empty constructor for JSON serialization support
    //-------------------------------------------------------------------------------

    public JobCode() { }
}

我正在尝试通过此调用反序列化数据:

newResource = JsonConvert.DeserializeObject<JobCode>(jsonResponse);

其中jsonResponse是上面输出的代码。
当我执行代码时,“ newResource”总是返回为空-
这并不意外,因为我知道数据中实际上有多个作业代码,并且此代码试图将其反序列化为单个JobCode对象。我尝试创建一个名为“
JobCodes”的新类,如下所示:

class JobCodes
{
    [JsonProperty("jobcodes")]
    public List<JobCode>_JobCodes { get; set; }
}

然后我尝试调用此命令:

newResource = JsonConvert.DeserializeObject<JobCodes>(jsonResponse);

但是问题仍然存在-我的返回对象为null。我认为让我失望的是标识符“ 1”和“
2”的存在。我不知道如何在我的对象设计和/或JSON.NET类/属性属性(例如[JsonObject],[JsonProperty]等)的使用中考虑它们的存在。

当我通过JSON2CSharp运行JSON数据时,它构造了一些看起来很奇怪的类,因此尚未证明它太有效。我已经用几个不同的验证器验证了JSON,并且都将其检出-
我只是不知道我在这里缺少什么。

最终,我想从JSON数据返回一个List,但是我为实现该目标而感到困惑。


阅读 364

收藏
2020-05-19

共1个答案

小编典典

您的问题是双重的:

  1. 您没有在根级别定义的类。类结构需要匹配 整个 JSON,您不能只是从中间反序列化。
  2. 每当您拥有一个可以更改其键的对象时,都需要使用Dictionary<string, T>。普通班是行不通的。一个也不会List<T>

使您的班级像这样:

class RootObject
{
    [JsonProperty("results")]
    public Results Results { get; set; }
}

class Results
{
    [JsonProperty("jobcodes")]
    public Dictionary<string, JobCode> JobCodes { get; set; }
}

class JobCode
{
    [JsonProperty("_status_code")]
    public string StatusCode { get; set; }
    [JsonProperty("_status_message")]
    public string StatusMessage { get; set; }
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("name")]
    public string Name { get; set; }
}

然后,像这样反序列化:

RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);

在这里工作演示

2020-05-19