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

时间:2016-10-04 15:01:28

标签: c# json.net

我无法找到一种方法来自动反序列化(服务器端)所有null字符串到library(mongolite) library(jsonlite) id <- c('35325073','35325078') id_list_JSON <- toJSON(id) test3 <- m1$find('{"_id": {"$in": id_list_JSON}}', fields = '{"_id" : 1, "f.fid" : 1, "ud" : 1}') 。默认情况下,Json.Net只是将值赋给object属性,我需要逐字符串地验证它是空的还是空格,然后将其设置为null。

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

如何在Json Net上覆盖它?

1 个答案:

答案 0 :(得分:3)

经过大量的挖掘,我解决了我的问题。 如果我反序列化包含属性为字符串的复杂对象,则注释中提出的所有解决方案才有效。 在这种情况下,是的,只需修改合同解析器即可[1]。

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

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会向读者分配TokenType JsonToken.StartObject,这将导致反序列化遵循{{1}的特定路径调用。

但是,如果对象只是一个字符串,property.ValueProvider.SetValue(target, value);将是TokenType,路径将不同,并且永远不会调用值提供程序。

无论如何,我的解决方案是构建一个自定义转换器来转换JsonToken.StringJsonReader(代码如下)。

<强>解决方案

TokenType == JsonToken.String

[1]致@RaphaëlAlthaus。

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