我正在尝试使用JsonConverter
from 这个答案 https://stackoverflow.com/a/33094930/2120779 to 我可以在属性中指定路径以将类中的属性映射到 JSON 中的子属性吗? https://stackoverflow.com/q/33088462/3744182 by 布赖恩·罗杰斯 https://stackoverflow.com/users/10263/brian-rogers将 JSON 中的嵌套属性映射到平面对象。
转换器运行良好,但我需要启动OnDeserialized
回调来填充其他属性,但它不会被触发。如果我不使用转换器,则会触发回调。
例子:
string json = @"{
'response': {
'code': '000',
'description': 'Response success',
},
'employee': {
'name': 'Test',
'surname': 'Testing',
'work': 'At office'
}
}";
// employee.cs
public class EmployeeStackoverflow
{
[JsonProperty("response.code")]
public string CodeResponse { get; set; }
[JsonProperty("employee.name")]
public string Name { get; set; }
[JsonProperty("employee.surname")]
public string Surname { get; set; }
[JsonProperty("employee.work")]
public string Workplace { get; set; }
[OnDeserialized]
internal void OnDeserializedMethod(StreamingContext context)
{
Workplace = "At Home!!";
}
}
// employeeConverter.cs
public class EmployeeConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
object targetObj = Activator.CreateInstance(objectType);
foreach (PropertyInfo prop in objectType.GetProperties()
.Where(p => p.CanRead && p.CanWrite))
{
JsonPropertyAttribute att = prop.GetCustomAttributes(true)
.OfType<JsonPropertyAttribute>()
.FirstOrDefault();
string jsonPath = (att != null ? att.PropertyName : prop.Name);
JToken token = jo.SelectToken(jsonPath);
if (token != null && token.Type != JTokenType.Null)
{
object value = token.ToObject(prop.PropertyType, serializer);
prop.SetValue(targetObj, value, null);
}
}
return targetObj;
}
public override bool CanConvert(Type objectType)
{
// CanConvert is not called when [JsonConverter] attribute is used
return false;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
如果我添加[JsonConverter(typeof(EmployeeConverter))]
在 Employee 类中我得到:
=== With Converter ===
Code: 000
Name: Test
Surname: Testing
Workplace: At office
如果我删除[JsonConverter(typeof(EmployeeConverter))]
从 Employee 类我得到:
=== With Converter ===
Code:
Name:
Surname:
Workplace: At Home!!
我的目标是获得:
=== With Converter ===
Code: 000
Name: Test
Surname: Testing
Workplace: At Home!!
转换器是否缺少某些东西?