Json转换空字符串而不是null
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Json转换空字符串而不是null相关的知识,希望对你有一定的参考价值。
我正在尝试序列化我的结构,以便没有获得值的字符串获取其默认值“”而不是null
[JsonProperty(PropertyName = "myProperty", DefaultValueHandling = DefaultValueHandling.Populate)]
[DefaultValue("")]
public string MyProperty{ get; set; }
我在Json字符串中的结果:
"myProperty": null,
我想要的是
"myProperty": "",
我也试过创建一个没有任何影响的转换器,因为某种原因,转换和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("");
}
}
这对qazxsw poi无济于事
这应该工作:
Json.Net How to deserialize null as empty string?
var settings = new JsonSerializerSettings() { ContractResolver= new NullToEmptyStringResolver() };
var str = JsonConvert.SerializeObject(yourObj, settings);
虽然接受的答案指出了我正确的方向,但它看起来很脆弱。我不想担心解决public class NullToEmptyStringResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
return type.GetProperties()
.Select(p=>{
var jp = base.CreateProperty(p, memberSerialization);
jp.ValueProvider = new NullToEmptyStringValueProvider(p);
return jp;
}).ToList();
}
}
public class NullToEmptyStringValueProvider : IValueProvider
{
PropertyInfo _MemberInfo;
public NullToEmptyStringValueProvider(PropertyInfo memberInfo)
{
_MemberInfo = memberInfo;
}
public object GetValue(object target)
{
object result = _MemberInfo.GetValue(target);
if (_MemberInfo.PropertyType == typeof(string) && result == null) result = "";
return result;
}
public void SetValue(object target, object value)
{
_MemberInfo.SetValue(target, value);
}
}
对象列表并自己实现JsonProperty
,因为在Json.NET中可以使用功能完善的工具(可以进行各种优化和角落案例处理,这是基本的反映 - 基于重新实现不会)。
我的解决方案执行最小的覆盖和解析器替换,以确保只有绝对需要更改的部分才会被实际更改:
IValueResolver
好吧,我的解决方案非常简单,但不使用JSON.NET功能,只需将backend字段添加到您的属性:
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);
}
return property;
}
sealed class NullToEmptyStringValueProvider : IValueProvider
{
private readonly IValueProvider Provider;
public NullToEmptyStringValueProvider(IValueProvider provider)
{
if (provider == null) throw new ArgumentNullException("provider");
Provider = provider;
}
public object GetValue(object target)
{
return Provider.GetValue(target) ?? "";
}
public void SetValue(object target, object value)
{
Provider.SetValue(target, value);
}
}
}
编辑:
在c#6.0中,属性初始化将可用:
public class Test
{
private string _myProperty = string.Empty;
[JsonProperty(PropertyName = "myProperty")]
public string MyProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
}
@Kirill Shlenskiy的解决方案很棒,但它没有考虑public class Test
{
[JsonProperty(PropertyName = "myProperty")]
public string MyProperty { get; set;} = "";
}
属性。
NullValueHandling
这是一个改进的版本,将负责它。如果设置了[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark{ get; set; }
且值为null,则将在JSON输出中跳过它。
NullValueHandling.Ignore
以上是关于Json转换空字符串而不是null的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 pyodbc 准备语句插入空字符串而不是 NULL 值?
当没有匹配的记录时,如何将与另一个表连接的 group_concat 列更改为空字符串而不是 null?
java中json对象有没有方法可以把null值转换成空字符串