首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Json转换空字符串而不是null

Json转换空字符串而不是null
EN

Stack Overflow用户
提问于 2014-05-23 21:13:08
回答 4查看 77.8K关注 0票数 45

我正在尝试序列化我的结构,以便没有获得值的字符串得到它们的默认值"“,而不是null

[JsonProperty(PropertyName = "myProperty", DefaultValueHandling = DefaultValueHandling.Populate)]
[DefaultValue("")]
public string MyProperty{ get; set; }

我在Json字符串中的结果:

"myProperty": null,

我想要的

"myProperty": "",

我还尝试创建一个转换器,但没有任何效果,由于某些原因,can Convert和WriteJson函数甚至无法触发:

[JsonProperty(PropertyName = "myProperty")]
[JsonConverter(typeof(NullToEmptyStringConverter))]
public string MyProperty{ get; set; }

class NullToEmptyStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(object[]);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value == null)
            writer.WriteValue("");
    }
}

这对两个Json.Net How to deserialize null as empty string?都没有帮助

EN

回答 4

Stack Overflow用户

发布于 2014-05-23 21:27:32

好吧,我的解决方案非常简单,但不使用JSON.NET特性,只需将后端字段添加到您的属性:

public class Test
{
    private string _myProperty = string.Empty;

    [JsonProperty(PropertyName = "myProperty")]
    public string MyProperty
    {
        get { return _myProperty; }
        set { _myProperty = value; }
    }
}

编辑:

在c# 6.0中,属性初始化将可用:

public class Test
{
    [JsonProperty(PropertyName = "myProperty")]
    public string MyProperty { get; set;} = "";
}
票数 21
EN

Stack Overflow用户

发布于 2018-04-21 03:47:53

@Kirill Shlenskiy的解决方案很棒,但它没有考虑NullValueHandling属性。

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark{ get; set; }

这是一个改进的版本,可以解决这个问题。如果设置了NullValueHandling.Ignore并且值为null,则在JSON输出中将跳过该值。

public sealed class SubstituteNullWithEmptyStringContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);
        if (property.PropertyType == typeof(string))
        {
            // Wrap value provider supplied by Json.NET.
            property.ValueProvider = new NullToEmptyStringValueProvider(property.ValueProvider, property.NullValueHandling);
        }
        return property;
    }

    sealed class NullToEmptyStringValueProvider : IValueProvider
    {
        private readonly IValueProvider Provider;
        private readonly NullValueHandling? NullHandling;

        public NullToEmptyStringValueProvider(IValueProvider provider, NullValueHandling? nullValueHandling)
        {
            Provider = provider ?? throw new ArgumentNullException("provider");
            NullHandling = nullValueHandling;
        }

        public object GetValue(object target)
        {
            if (NullHandling.HasValue 
                && NullHandling.Value == NullValueHandling.Ignore
                && Provider.GetValue(target) == null )
            {
                return null;
            }
            return Provider.GetValue(target) ?? "";
        }

        public void SetValue(object target, object value)
        {
            Provider.SetValue(target, value);
        }
    }
}
票数 6
EN

Stack Overflow用户

发布于 2020-01-29 22:46:55

另一种解决方案(也许更干净一点)。您可以创建自己的JsonConverter类

class JsonNullToEmptyStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    {
        return existingValue ?? string.Empty;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(value ?? string.Empty);
    }
}

一旦这段代码被记录下来,你就可以将它作为一个属性附加到你的属性中:

[JsonConverter(typeof(JsonNullToEmptyStringConverter))]
public string CommentType { get; set; }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23830206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档