c# - 使用 JSON.net 处理(反)序列化主数据

标签 c# serialization json.net deserialization

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

相关文章:

c# - Json.Net - 反序列化包含对象列表的对象列表

c# - 我可以在 linq 中克隆 IQueryable 吗?出于联合目的?

c# - flowlayoutpanel 和水平滚动条问题

c# - 如何计算 IEnumerable<int> 中 int[] 中的每个数字存在多少次?

.net - JSON.net 不包括 EmitDefaultValue 为 false 的空属性

c# - 反序列化 JSON 字符串列表以找到正确的模型

c# - 启动 Windows 服务时出现 TypeInitializationException,因为无法创建配置部分

c# - Newtonsoft JSON - 数组未正确序列化

serialization - 在 Scalding 中读写案例类

c++ - 二进制文件的模板化读写