gpt4 book ai didi

c# - 使用 Json.Net 将空字符串转换为 null

转载 作者:太空宇宙 更新时间:2023-11-03 23:09:31 27 4
gpt4 key购买 nike

我找不到一种方法来自动反序列化(服务器端)所有 EmptyOrWhiteSpace 字符串为 null 。 Json.Net默认只是简单的给对象属性赋值,我需要逐个字符串验证是空还是空格,然后设置为null。

我需要在反序列化时完成此操作,因此我不必记住验证来自客户端的每个字符串。

如何在 Json Net 上覆盖它?

最佳答案

经过大量的资源挖掘,我解决了我的问题。事实证明,评论中提出的所有解决方案仅在我反序列化包含字符串属性的复杂对象时才有效。在这种情况下,是的,只需修改契约(Contract)解析器即可 [1]。

但是,我需要的是一种在反序列化时将任何 字符串转换为 null 的方法,并且在我的对象只是一个字符串的情况下,以这种方式修改契约(Contract)将失败,即,

public void MyMethod(string jsonSomeInfo)
{
// At this point, jsonSomeInfo is "\"\"",
// an emmpty string.

var deserialized = new JsonSerializer().Deserialize(new StringReader(jsonSomeInfo), typeof(string));

// deserialized = "", event if I used the modified contract resolver [1].
}

发生的情况是,当我们处理复杂对象时,JSON.NET 在内部将 JsonToken.StartObjectTokenType 分配给读取器,这将导致反序列化遵循调用 property.ValueProvider.SetValue(target, value); 的特定路径。

但是,如果对象只是一个字符串,TokenType 将是 JsonToken.String,并且路径会不同,并且永远不会调用值提供程序.

无论如何,我的解决方案是构建一个自定义转换器来转换具有 TokenType == JsonToken.String(代码如下)的 JsonReader

解决方案

public class StringConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null) return null;

string text = reader.Value.ToString();

if (string.IsNullOrWhiteSpace(text))
{
return null;
}

return text;
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException("Not needed because this converter cannot write json");
}

public override bool CanWrite
{
get { return false; }
}
}

[1] 感谢@Raphaël Althaus。

public class NullToEmptyStringResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
return type.GetProperties()
.Select(p => {
var jp = base.CreateProperty(p, memberSerialization);
jp.ValueProvider = new EmptyToNullStringValueProvider(p);
return jp;
}).ToList();
}
}

public class EmptyToNullStringValueProvider : IValueProvider
{
PropertyInfo _MemberInfo;

public EmptyToNullStringValueProvider(PropertyInfo memberInfo)
{
_MemberInfo = memberInfo;
}

public object GetValue(object target)
{
object result = _MemberInfo.GetValue(target);

if (_MemberInfo.PropertyType == typeof(string) && result != null && string.IsNullOrWhiteSpace(result.ToString()))
{
result = null;
}

return result;
}

public void SetValue(object target, object value)
{
if (_MemberInfo.PropertyType == typeof(string) && value != null && string.IsNullOrWhiteSpace(value.ToString()))
{
value = null;
}

_MemberInfo.SetValue(target, value);
}
}

关于c# - 使用 Json.Net 将空字符串转换为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39855694/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com