使用 JSON.NET 我遇到了与 GET 和 POST 操作有关的 MasterData 问题。
以电影为例,在反序列化之前我可以通过 GET 操作获取的 JSON 如下:
{
“movie”: {
“name”:”bad boys”,
”genre”: {
“id”:"1",
”name”:”thriller”
}
}
}
但是,在 POST 操作中,我想构造一个如下所示的序列化字符串:
{
“movie”: {
“name”:”bad boys”,
”genre”:"1"
}
}
如您所见,通过 GET 操作,我需要反序列化完整的对象,而在序列化 POST 时,我只需添加 Id,但使用相同的 JsonPropertyName。
获得这种情况的最干净的方法是什么?我一直在尝试研究 IContractResolver 和 IReferenceResolver,但这些都还没有让我实现目标。还尝试使用属性名称,如下例所示:
[JsonProperty(PropertyName = "genre")]
public Genre Genre { get; set; }
[JsonProperty(PropertyName = "genre")]
public string GenreId { get { return Genre != null ? Genre.Id : 0; } }
我还尝试过使用 ShouldSerialize[MemberName] 和 ShouldDeserialize[MemberName] 情况,但这些情况给出了一个异常(exception),即我不能使用两个具有相同名称的属性,这在某种程度上是合乎逻辑的。
目前,我唯一剩下的想法是使用 DTO 进行序列化,但我宁愿选择比该解决方案更干净的解决方案。欢迎提出建议!
最佳答案
您可以编写自定义转换器。
public class GenreConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Genre);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return JObject.Load(reader).ToObject<Genre>();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var genre = value as Genre;
writer.WriteValue(genre.id);
}
}
您现在需要的是使用 JsonConverter
属性
public class Movie
{
public string Name { get; set; }
[JsonConverter(typeof(GenreConverter))]
public Genre Genre { get; set; }
}
关于c# - 使用 JSON.net 处理(反)序列化主数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31723663/