gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:23:23 26 4
gpt4 key购买 nike

我使用 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/

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