【问题标题】:Removing empty elements from the serialized Json从序列化的 Json 中删除空元素
【发布时间】:2017-08-22 13:24:25
【问题描述】:

以下是我的Json serialization 代码和CustomResolver,最后检查实际和预期结果之间的差异。我无法从最终结果中删除空元素。有一个可用的选项here,但在我使用ASP.Net Web API 的实际应用程序中,我无权调用JsonConvert.SerializeObject,它是自动调用的,可能需要在Custom Contract Resolver 中执行此操作,任何帮助/指针都会很棒

void Main()
{
    var cbList = new List<CustomerBusiness>();

    cbList.Add(new CustomerBusiness { Id = null, Name = null, PhoneNumber = null });
    cbList.Add(new CustomerBusiness { Id = 1, Name = null, PhoneNumber = null });
    cbList.Add(new CustomerBusiness { Id = null, Name = "Mrinal", PhoneNumber = null });
    cbList.Add(new CustomerBusiness { Id = null, Name = null, PhoneNumber = "9886623261" });
    cbList.Add(new CustomerBusiness { Id = null, Name = null, PhoneNumber = null });
    cbList.Add(new CustomerBusiness { Id = null, Name = null, PhoneNumber = null });

    var serializedData = JsonConvert.SerializeObject(cbList, Newtonsoft.Json.Formatting.Indented,new JsonSerializerSettings { ContractResolver = new CustomResolver() });

    serializedData.Dump();
}

public class CustomResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        IList<JsonProperty> retval = base.CreateProperties(type, memberSerialization);

        retval = retval.Select(p =>
        {
            p.PropertyName = char.ToLower(p.PropertyName[0]) + string.Join("", p.PropertyName.Skip(1));
            p.NullValueHandling = NullValueHandling.Ignore;
            return p;
        }).ToList();

        return retval;
    }
}

public class CustomerBusiness
{
    public int? Id { get; set; }

    public string Name { get; set; }

    public string PhoneNumber { get; set; }
}

实际结果:

[
  {},
  {
    "id": 1
  },
  {
    "name": "Mrinal"
  },
  {
    "phoneNumber": "9886623261"
  },
  {},
  {}
]

预期结果:

[
  {
    "id": 1
  },
  {
    "name": "Mrinal"
  },
  {
    "phoneNumber": "9886623261"
  }
]

【问题讨论】:

标签: c# json asp.net-web-api json.net


【解决方案1】:
var serializedData = JsonConvert.SerializeObject(
    cbList,
    Newtonsoft.Json.Formatting.Indented,new JsonSerializerSettings { ContractResolver = new CustomResolver() });

应该替换为:

var serializedData = JsonConvert.SerializeObject(
    cbList.Where(z => z.Id != null || z.Name != null || z.PhoneNumber != null),
    Newtonsoft.Json.Formatting.Indented,new JsonSerializerSettings { ContractResolver = new CustomResolver() });

Where 子句将确保您仅序列化“非空”数据。

【讨论】:

  • 这是一个很好的解决方法+1,但我不能使用它,首先我不调用原始帖子中提到的 SerilaizeObject 调用,并且可以为其他要求公开相同的数据,所以它不需要在所有 API 调用中删除所有空数据
  • 您需要使您的帖子中的代码尽可能接近您的真实代码,以便我们更轻松地为您提供帮助。请注意,我的回答与JsonConvert.SerializeObject 调用无关依赖 - 重要的是Where 调用。
  • 我认为这是我可以使用的最接近的控制台,其中已经提到了所有重要的细节,你认为缺失的部分是什么,你的解决方案主要集中在我想要的地方修剪集合在序列化期间完成,因为实际用例可能不允许删除空数据。如果您有序列化选项,请提供。我不确定,这是否决票的原因
  • where I want it to be done during serialization, since null data removal may not be allowed for real use case 你能告诉我们为什么在实际用例中不允许删除空数据吗?
  • 由于多个调用者使用相同的数据,其中有些人希望在其 Ui 控件中显示所有 null 或空记录以及单独的消息,以提供更多信息,这就是为什么可选序列化优于修改数据源。我希望这能澄清具体的用例。无论如何,我只专注于获得特定于序列化的解决方案,自定义联系人解析器可以完成这项工作
猜你喜欢
  • 2012-11-08
  • 2012-01-23
  • 2012-08-06
  • 2013-10-28
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多