如何删除json字符串中的null值

本文关键字:字符串 null json 何删除 删除 | 更新日期: 2023-09-27 18:05:25

嗨,我正在使用下面的类

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

一旦我序列化它,我就会得到如下输出,比如

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

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

{"name":[hari]}

它不应该显示具有null值的class属性,而我使用的是c#.net框架。

如何删除json字符串中的null值

完整答案取决于如何序列化类。

如果您使用数据协定来序列化类,请设置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 全局设置

如果你正在使用Json.Net,那么你可以通过像一样装饰你的房产来尝试

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

正如p.s.w.g所说,最好首先正确序列化。这里可以看到一个没有null的序列化示例

例如

var json = JsonConvert.SerializeObject(
        objectToSerialize,
        new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore});
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(); }
    }
}

以下是您将如何使用上面的内容,它将忽略null值。

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

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

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

字符串signatureJson=JsonConvert.SerializeObject(signature,Newtonsoft.Json.Formating.Inded,new JsonSerializerSettings{NullValueHandling=NullValueHandle.Ignore}(;

老问题,但今天用.net6你可以做到:

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public List<string> midname;

并且midname列表不会出现在序列化对象中。

如果使用System.Text.Json(出于性能原因,建议使用(。这是消除null值的另一种变通方法,在我的情况下,由于属性的数量,使用decorator是不可行的,所以让我们使用JsonSerializerOptions

var content = new ContentToParse() { prop1 = "val", prop2 = null };
string json = System.Text.Json.JsonSerializer.Serialize(content, new 
     System.Text.Json.JsonSerializerOptions()  { DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull 
    });
//json {"prop1":"val"}