我有一个字段名称带有"_"的 json。但是,我需要映射这些字段的类没有下划线。由于字段名称不匹配,我将映射类的值设置为 null。 我想在将 json 字段映射到实体类之前从 json 字段中删除下划线。您能否建议哪种方式可以完成 - 使用CustomConverter或使用DefaultContractResolver以及哪种方式是更好的实现。 示例 JSON 如下:
{"My_UnitOfStudyStatus_Code":"1234"
相应的实体类有一个名为MyUnitOfStudyStatusCode的字段,我需要一个名为我的通用解决方案,我可以将其用于我的所有json并映射到所有相应的实体。
我试图按如下方式进行消毒
JsonConvert.DeserializeObject<TEntityType>(jsonString, new IgnoreUnderScoreConverter<TEntityType>()
对于我尝试并卡在下面的转换器实现:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
{
JObject jobject = JObject.Load(reader);
var model = new T();
//Need to rename fields for jobject
serializer.Populate(renamed.CreateReader(), model);
return model;
}
但是我可能在这里缺少一些东西,在它们映射到实体类之前,我无法重命名从 jobject 获得的字段。 请建议。
您可以使用 JsonPropertyName 属性。 例如:
[JsonPropertyName("_name")]
public string Name {get;set;}
这将正确反序列化,即使 JSON 中的属性名称中有下划线
根据 https://www.jerriepelser.com/blog/deserialize-different-json-object-same-class/的工作,可以使用自定义JsonConverter
在其中重写ReadJson()
方法,其中替换接收属性名称中的下划线以查找实体类中要填充的目标属性。使用JObject.Properties()
方法循环访问所有收到的属性并相应地调整名称。实现可能如下所示:
public class TestEntity
{
public string MyUnitOfStudyStatusCode {get; set;}
public int NormalInt {get; set;}
public string NormalString {get; set;}
public float AdjustedFloatName {get; set;}
}
public class MyJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartObject)
{
object instance = Activator.CreateInstance(objectType);
var props = objectType.GetTypeInfo().DeclaredProperties.ToList();
JObject jo = JObject.Load(reader);
foreach (JProperty jp in jo.Properties())
{
string name = jp.Name;
name = name.Replace("_", string.Empty);
PropertyInfo prop = props.Single(pi => pi.CanWrite && pi.Name == name);
object resultObject = jp.Value.ToObject(prop.PropertyType, serializer);
object convertedResultObject = Convert.ChangeType(resultObject, prop.PropertyType);
prop.SetValue(instance, convertedResultObject);
}
return instance;
}
else
{
return reader.Value;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
public class Program
{
public static void Main(string[] args)
{
const string jsonString = "{"+
""My_UnitOfStudyStatus_Code": "1234","+
""NormalInt": 42,"+
""NormalString": "abc","+
""Adjusted_Float_Name": 3.1415"+
"}";
TestEntity result = JsonConvert.DeserializeObject<TestEntity>(jsonString, new MyJsonConverter());
Console.WriteLine(result.MyUnitOfStudyStatusCode);
Console.WriteLine(result.NormalInt);
Console.WriteLine(result.NormalString);
Console.WriteLine(result.AdjustedFloatName);
}
}
这将生成以下输出:
1234
42
abc
3.1415