【问题标题】:C# WebApi - Json serialize bring a property to higher levelC# WebApi - Json 序列化将属性提升到更高级别
【发布时间】:2020-02-11 20:53:53
【问题描述】:

我有一个具有以下结构的类

class Model
{
   public int Id {get;set;}
   public Dictionary<string, List<ComplexType>> Values {get;set;}
}

在 Dotnetcore webApi 项目中使用并作为以下对象从我的控制器返回

Ok(new List<Model>() { 
new Model{
  Id = 1,
  Values = new Dictionary<string, List<ComplexType>>() { {"Item1", new List<ComplexType>()} }
} } )

这将产生 Json 输出为:

[
     {
         "Id": "1"
         "Values": {
           "Item1": [{}]
          }
     }
]

所以我的问题是任何可能的方式,将 Dictionary 属性名称带到输出 Json 结构中的更高级别。 基本上在“模型”类中省略属性名称“值”并合并较低的对象,所以它看起来像这样:

[
     {
         "Id": "1"
         "Item1": [{}]
     }
]

【问题讨论】:

  • 你为什么不一起删除 values 属性,让 Model 成为字典
  • @Steve 这意味着我必须将Id 属性移动到ComplexType 中。我需要在同一级别拥有该特定属性,最终获得我需要的 Json 输出
  • 实际上你是对的,如果我将Id 添加为 Dictionary 本身的属性,它可以工作。但这也意味着Id 应该具有与Item1 相同的值类型,因为它应该是int 类型,可以使用动态或对象类型等解决方法。如果可能的话,仍然想尝试保留以前的方式

标签: c# json serialization json.net webapi


【解决方案1】:

您可以一起删除该 Value 属性并使 Model 成为字典类型

class Model : Dictionary<string, List<ComplexType>> 
{
     public int Id { get; set; } 
} 

那你就可以了

var model = new Model();
model.Id = 123;
model["Item1"] = new List<ComplexType>();

【讨论】:

  • 是的,在您之前的评论之后,我确实尝试过,但是有两个问题,它不是从 webapi 响应中序列化 Id 并获得与“更新实现以符合 ISerializable 模式”相关的声纳警告..将找出后者但前者本身没有发生......
  • @JagatSingh 不确定您使用的是什么序列化程序。但 json.net 应该能够很好地处理它。我相信您可以为 web api 设置序列化程序。不记得我头顶上的确切程序
【解决方案2】:

您可以编写自己的序列化程序,它比您想象的要简单,并且您可以更好地控制生成的 json。

class Model
{
    public int Id { get; set; }
    public Dictionary<string, List<ComplexType>> Values { get; set; }

    public string ToJson()
    {
        return
            $"{{" +
            $"\"{nameof(Id)}\":\"{Id}\"," +
            string.Join(",", Values.Select(x => $"\"{x.Key}\":" + Newtonsoft.Json.JsonConvert.SerializeObject(x.Value))) +
            $"}}";
    }
}

那就这样称呼吧——

var json = "[" + string.Join(",", obj.Select(x => x.ToJson())) + "]";

最后返回上面的json作为响应。

var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(json, Encoding.UTF8, "application/json");
return response;

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多