【问题标题】:nested json object from a single model来自单个模型的嵌套 json 对象
【发布时间】:2021-10-18 07:09:34
【问题描述】:

我有一个模型类,如下所示:

 public class ApiRequest{
    [JsonProperty(PropertName="name")]
    public string Name{get;set;}
    [JsonProperty(PropertName="description")]
    public string Description{get;set;}
    [JsonProperty(PropertName="privacy.view")]
    public string PrivacyStats {get;set}
}

当我调用 API 时,它应该将此模型转换为带有嵌套对象的 json,以获取隐私状态,如下所示

    {
         "name":"Test1",
         "description":"Testing Only",
         "privacy":{
               "view":"unlisted"
}
    }

如何将单个模型映射到嵌套对象而不为同一模型创建另一个类?

【问题讨论】:

  • 您是否尝试使用动态类型作为状态?
  • 根据您使用的 JSON 序列化程序(例如:Newtonsoft json),您必须实现适当的转换器。您可以查看此示例以获取 newtonsoft:newtonsoft.com/json/help/html/CustomJsonConverter.htm
  • 用一个字段为json字段privacy添加额外的模型比实现自定义转换器并维护它要容易得多。

标签: c# json json-deserialization


【解决方案1】:

您应该为PropertyStats 再声明一个模型。否则,修改已创建的JSON 字符串将是一种逆向工程。

像这样:

public class ApiRequest
{
    [JsonProperty(PropertyName = "name")]
    public string Name { get; set; }
    [JsonProperty(PropertyName = "description")]
    public string Description { get; set; }
    [JsonProperty(PropertyName = "privacy")]
    public PropertyStats PrivacyStats { get; set; }
}

public class PropertyStats
{
    [JsonProperty(PropertyName = "view")]
    public string View { get; set; }
}

那你就可以这样序列化了。

static void Main(string[] args)
{
    ApiRequest objApiRequest = new ApiRequest()
    {
        Name = "Test1",
        Description = "Testing Only",
        PrivacyStats = new PropertyStats
        {
            View = "unlisted"
        }
    };

    var serializedString = JsonConvert.SerializeObject(objApiRequest, Formatting.Indented);

    Console.WriteLine(serializedString);
    Console.ReadLine();
}

输出:

{
  "name": "Test1",
  "description": "Testing Only",
  "privacy": {
    "view": "unlisted"
  }
}

将来,如果您想在隐私模型中添加额外的属性,那么序列化它会很容易。

如下:

public class PropertyStats
{
    [JsonProperty(PropertyName = "view")]
    public string View { get; set; }
    [JsonProperty(PropertyName = "status")]
    public int StatusCode { get; set; }
}

像下面这样序列化:

static void Main(string[] args)
{
    ApiRequest objApiRequest = new ApiRequest()
    {
        Name = "Test1",
        Description = "Testing Only",
        PrivacyStats = new PropertyStats
        {
            View = "unlisted",
            StatusCode = 1
        }
    };

    var serializedString = JsonConvert.SerializeObject(objApiRequest, Formatting.Indented);

    Console.WriteLine(serializedString);
    Console.ReadLine();
}

输出:

{
  "name": "Test1",
  "description": "Testing Only",
  "privacy": {
    "view": "unlisted",
    "status": 1
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多