Json Converte string vazia em vez de null

Eu estou tentando serializar minha estrutura para que as seqüências de caracteres que não obtiveram um valor obter seu valor padrão “” em vez de null

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

Meu resultado na string do Json:

 "myProperty": null, 

o que eu quero

 "myProperty": "", 

Eu também tentei criar um conversor sem nenhum efeito, as funções Converter e WriteJson podem nem ser triggersdas por algum motivo:

 [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(""); } } 

Isso não está ajudando Json.Net Como desserializar null como string vazia?

Isso deve funcionar:

 var settings = new JsonSerializerSettings() { ContractResolver= new NullToEmptyStringResolver() }; var str = JsonConvert.SerializeObject(yourObj, settings); 

 public class NullToEmptyStringResolver : Newtonsoft.Json.Serialization.DefaultContractResolver { protected override IList 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); } } 

Bem, minha solução é bem simples, mas não usa os resources JSON.NET, basta adicionar o campo backend à sua propriedade:

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

Editar:

Na boot da propriedade c # 6.0 estará disponível:

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

Enquanto a resposta aceita me apontou na direção certa, parece bastante frágil. Eu não quero me preocupar em resolver a lista de objects JsonProperty e implementar o IValueResolver sozinho quando existem ferramentas perfeitamente funcionais disponíveis para fazer isso no Json.NET (que poderia ter todos os tipos de otimizações e manipulação de maiúsculas e minúsculas). a reimplementação baseada não irá).

Minha solução realiza substituição e substituição de resolução mínimas para garantir que apenas as partes que realmente precisam mudar sejam realmente alteradas:

 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); } } } 

A solução do @Kirill Shlenskiy é ótima, mas não leva em consideração o atributo NullValueHandling .

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

Aqui está uma versão melhorada que cuidará disso. Se NullValueHandling.Ignore estiver definido e o valor for nulo, ele será ignorado na saída 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); } } }