将 JSON 反序列化为 C# 类

时间:2023-04-27
本文介绍了将 JSON 反序列化为 C# 类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

以下是我在成功创建新的工作代码"条目后从 REST API 获得的(略微)精简的响应.我需要将响应反序列化为某些类,但我很难过.

Below is a (slightly) stripped down response I get from a REST API upon successful creation of a new "job code" entry. I need to deserialize the response into some classes, but I'm stumped.

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

For reference, I'm using JSON.NET in .NET 3.5 (running in a SSIS script in SQL Server 2008 R2) to attempt my deserialization. Here's the JSON - which I obviously have no control over as it's coming from someone else's 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 值部分映射到属性 - 我对返回给我的所有数据不感兴趣:

In my C# code, I do have a "JobCode" class defined which only partially maps the JSON values to properties - I'm not interested in all of the data that's returned to me:

[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() { }
}

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

I'm attempting to deserialize the data via this call:

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

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

Where jsonResponse is the code outputted above.
When I execute the code, "newResource" always comes back as null - which is not unexpected because I know that there are actually multiple jobcodes in the data and this code is trying to deserialize it into a single JobCode object. I tried creating a new class called "JobCodes" that looks like this:

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

然后我尝试调用这个:

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

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

But the issue persists - my return object is null. What's throwing me off, I think, is the presence of the "1" and "2" identifiers. I don't know how to account for their presence in my object design and/or usage of the JSON.NET class / property attributes like [JsonObject],[JsonProperty], etc.

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

When I run the JSON data through JSON2CSharp, it constructs some weird-looking classes, so that hasn't proven too effective. I've validated the JSON with several different validators and it all checks out - I just don't know what I'm missing here.

最终,我想从 JSON 数据中返回一个 List,但我不知道我需要做什么才能实现这一目标.

Ultimately, I'd like to return a List from the JSON data, but I'm stumped on what I need to do to make that happen.

推荐答案

你的问题是双重的:

  1. 您没有在根级别定义类.类结构需要匹配整个 JSON,不能只从中间反序列化.
  2. 只要你有一个可以改变键的对象,你就需要使用Dictionary.普通课程对此不起作用;List<T> 也不会.
  1. You don't have a class defined at the root level. The class structure needs to match the entire JSON, you can't just deserialize from the middle.
  2. Whenever you have an object whose keys can change, you need to use a Dictionary<string, T>. A regular class won't work for that; neither will a 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; }
}

然后,像这样反序列化:

Then, deserialize like this:

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

这里的工作演示

这篇关于将 JSON 反序列化为 C# 类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

上一篇:如何将 JSON 反序列化为 IEnumerable&lt;BaseType&gt;使用 Newtons 下一篇:如何反序列化具有动态(数字)键名的子对象?

相关文章