16

嗨,我正在使用下面的课程

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

一旦我对其进行序列化,我将得到以下输出,例如

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

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

{"name":[hari]}

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

4

6 回答 6

21

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

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

于 2013-03-22T15:51:34.470 回答
11

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

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public List<string> name { get; set; }
于 2013-03-22T15:53:02.473 回答
6

就像 pswg 所说,最好首先正确序列化。可以在此处查看不带空值的序列化示例

例如

var json = JsonConvert.SerializeObject(
        objectToSerialize,
        new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore});
于 2017-08-31T15:17:16.020 回答
3
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);

资源

于 2013-03-22T15:55:37.487 回答
1

字符串签名Json = JsonConvert.SerializeObject(签名,Newtonsoft.Json.Formatting.Indented,新 JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

于 2017-05-18T06:26:54.390 回答
1

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

var result = JsonConvert.SerializeObject(obj, 
            new JsonSerializerSettings() 
            { 
                NullValueHandling = NullValueHandling.Ignore 
            });
于 2021-03-09T06:13:05.567 回答