c# - 使用自动修剪字符串反序列化 json

标签 c# json.net deserialization

我使用 Newtonsoft.Json 库

有没有办法在反序列化期间从任何字符串数据中修剪空格?

class Program
{
    class Person
    {
        [JsonProperty("name")]
        public string Name;
    }
    static void Main(string[] args)
    {
        var p = JsonConvert.DeserializeObject<Person>(@"{ name: "" John "" }");
        Console.WriteLine("Name is: \"{0}\"", p.Name);
    }
}

添加:

最后,我得到了自定义转换器的解决方案。不好,但比使用 Trim() 的属性更好。

如果有人有任何想法如何以更自然的方式做到这一点,欢迎。

class Program
{
    sealed class TrimAttribute : Attribute
    { }

    class TrimConverter<T> : JsonConverter where T : new()
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var jObject = JObject.Load(reader);
            var obj = new T();
            serializer.Populate(jObject.CreateReader(), obj);

            var props = objectType.GetFields(BindingFlags.Instance | BindingFlags.Public)
                .Where(p => p.FieldType == typeof(string))
                .Where(p => Attribute.GetCustomAttributes(p).Any(u => (Type) u.TypeId == typeof(TrimAttribute)))
                ;

            foreach (var fieldInfo in props)
            {
                var val = (string) fieldInfo.GetValue(obj);
                fieldInfo.SetValue(obj, val.Trim());
            }

            return obj;
        }

        public override bool CanConvert(Type objectType)
        {
            return objectType.IsAssignableFrom(typeof (T));
        }
    }

    [JsonConverter(typeof(TrimConverter<Person>))]
    class Person
    {
        [JsonProperty("name")]
        [Trim]
        public string Name;

        [JsonProperty("surname")]
        public string Surname;
    }
    static void Main(string[] args)
    {
        var p = JsonConvert.DeserializeObject<Person>(@"{ name: "" John "", surname: "" Smith "" }");
        Console.WriteLine("Name is: \"{0}\", \"{1}\"", p.Name, p.Surname);
    }
}

最佳答案

你可以自己写JsonConverter :

public class TrimmingConverter : JsonConverter
{
    public override bool CanRead => true;
    public override bool CanWrite => false;

    public override bool CanConvert(Type objectType) => objectType == typeof(string);

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

    public override void WriteJson(JsonWriter writer, object value, 
                                   JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

您可以像这样使用它来应用于所有字符串字段:

var json = @"{ name:"" John "" }"
var p = JsonConvert.DeserializeObject<Person>(json, new TrimmingConverter());
Console.WriteLine("Name is: \"{0}\"", p.Name);
//Name is: "John"

或者您可以仅将此应用于某些字段:

public class Person
{
    [JsonProperty("name")]
    [JsonConverter(typeof(TrimmingConverter))] // <-- that's the important line
    public string Name { get; set; }
    [JsonProperty("other")]
    public string Other { get; set; }
}

var json = @"{ name:"" John "", other:"" blah blah blah "" }"
var p = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine("Name is: \"{0}\"", p.Name);
Console.WriteLine("Other is: \"{0}\"", p.Other);

//Name is: "John"
//Other is: " blah blah blah "

关于c# - 使用自动修剪字符串反序列化 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19271470/

相关文章:

c# - 以编程方式设置 Active Directory 密码时,如何要求更改密码?

c# - Microsoft Visual Studio 2017 安装程序项目启动条件检查不适用于 .net 4.7.1

c# - 并行文件读取是否比顺序读取更快?

c# - 忽略Elasticsearch Nest中的TypeConverter属性

c# - 使用 JSON.Net 反序列化 $ref 文档指针

c# - 无法加载文件或程序集 'Newtonsoft.Json'

java - 如何使用 Jackson 反序列化 null 类型 JSON 字段

c# - 将异步调用变成同步调用

json - Flutter - 解析 Json 的最佳方法是什么?

java - Unicode 字符 ""有什么特别之处,以至于它破坏了基于大括号的解析器逻辑?