【问题标题】:How to remove null value in json string如何删除json字符串中的空值
【发布时间】:2013-03-22 15:48:48
【问题描述】:

你好,我正在使用下面的类

Public List<string> name;
Public List<string> midname;

一旦我序列化它,我会得到以下输出,例如

 {"name":[hari],"midname":null}

但我希望我的答案是这样的

{"name":[hari]}

它不应该显示具有 null 值的类属性,并且我正在使用 c# .net 框架。

【问题讨论】:

  • 你用什么来执行序列化?知道提供答案会很有帮助...
  • 我认为 linq 或许能够做到这一点。
  • 你是怎么序列化的,你用的是什么工具?
  • 你在用json.net吗?
  • 你用什么库来序列化?

标签: c# asp.net .net json


【解决方案1】:

完整的答案取决于您如何序列化您的课程。

如果您使用数据协定来序列化您的类,请设置EmitDefaultValue = false

[DataContract]
class MyClass
{
    [DataMember(EmitDefaultValue = false)]
    public List<string> name;

    [DataMember(EmitDefaultValue = false)]
    public List<string> midname { get; set; }
}

如果您使用的是Json.Net,请改用此方法

class MyClass
{
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public List<string> name;

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public List<string> midname { get; set; }
}

或者用JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore全局设置

【讨论】:

    【解决方案2】:

    如果您使用的是Json.Net,那么您可以通过像这样装饰您的财产来试试这个

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public List<string> name { get; set; }
    

    【讨论】:

      【解决方案3】:

      就像 p.s.w.g 所说,最好首先正确序列化。不带空序列化的例子可以看here

      例如

      var json = JsonConvert.SerializeObject(
              objectToSerialize,
              new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore});
      

      【讨论】:

      • 太棒了!效果很好
      【解决方案4】:
      private class NullPropertiesConverter : JavaScriptConverter
      {
          public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
          {
              throw new NotImplementedException();
          }
      
          public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
          {
              var jsonExample = new Dictionary<string, object>();
              foreach (var prop in obj.GetType().GetProperties())
              {
                  //check if decorated with ScriptIgnore attribute
                  bool ignoreProp = prop.IsDefined(typeof(ScriptIgnoreAttribute), true);
      
                  var value = prop.GetValue(obj, BindingFlags.Public, null, null, null);
                  if (value != null && !ignoreProp)
                      jsonExample.Add(prop.Name, value);
              }
      
              return jsonExample;
          }
      
          public override IEnumerable<Type> SupportedTypes
          {
              get { return GetType().Assembly.GetTypes(); }
          }
      }
      

      以下是您将如何利用上述内容,它将忽略空值。

      var serializer = new JavaScriptSerializer();
          serializer.RegisterConverters(new JavaScriptConverter[] { new NullPropertiesConverter() });
          return serializer.Serialize(someObjectToSerialize);
      

      Source

      【讨论】:

      • 很好的答案,无需使用 3rd 方库,也无需更改序列化类。
      【解决方案5】:

      string signatureJson = JsonConvert.SerializeObject(signature, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

      【讨论】:

        【解决方案6】:

        您可以使用 Newtonsoft.json 中的 JsonConvert 而不是 JavaScriptSerializer

        var result = JsonConvert.SerializeObject(obj, 
                    new JsonSerializerSettings() 
                    { 
                        NullValueHandling = NullValueHandling.Ignore 
                    });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-18
          • 2017-11-29
          • 2023-04-07
          • 2014-10-29
          • 1970-01-01
          • 2011-11-23
          • 1970-01-01
          相关资源
          最近更新 更多