【问题标题】:Json Serializer with multiple JsonProperty Newtonsoft.Json [duplicate]具有多个 JsonProperty Newtonsoft.Json 的 Json 序列化器 [重复]
【发布时间】:2021-03-02 07:31:49
【问题描述】:

我有一个带有 JsonProperty 属性的实体类如下:

public class Book
{
    [JsonProperty("id")]
    public long BookId { get; set; }
    [JsonProperty("name")]
    public string BookName { get; set; }
}

我想将它从 JSON 字符串反序列化为实体。由于 JsonProperty idname,json 应该具有 id/name 模式,在这种情况下,反序列化可以完美地工作(如预期的那样)。但在某些情况下,json字符串也可以有BookIdBookName。我可以有多个 JsonProperty 属性来处理这个吗?或者有没有办法让序列化程序知道,如果不是 id 则使用 BookId 反序列化?或者任何其他方式来处理这个用例?

【问题讨论】:

标签: json asp.net-core .net-core serialization json.net


【解决方案1】:

您可以在反序列化 json 之前替换属性名称。

    var book = @"
        [
          {
            'id': 123456789,
            'name': 'book1'
          },
          {
            'BookId': 1234567,
            'BookName': 'book2'
          }
        ]
        ";

        var after=book.Replace("BookId", "id").Replace("BookName","name");
        var sbook =  JsonConvert.DeserializeObject<List<Book>>(after);

然后就可以拿到整个反序列化对象了。

【讨论】:

  • @Anish Unnikrishnan,这对你有帮助吗?
  • String.replace 是一种巧妙的技术。可以在不同的场景中使用 full。但它不适合我的用例。无论如何,谢谢卡尼。
  • @AnishUnnikrishnan,但你的方案是什么?
  • 我正在从数据库调用中获取数据。并且可能具有类似于实际数据本身的键的字符。 String.Replace 将来也将替换实际导致的错误。
  • 没有配置映射多个属性,只能手动处理。
【解决方案2】:

您可以通过定义替代属性来解决此问题,该替代属性重定向到现有属性。例如,

public class Book
{
    [JsonProperty("bookId")]
    public long BookId { get; set; }
    
    [JsonProperty("id")]
    private long Id
    {
        get => BookId;
        set => BookId = value;
    }
    [JsonProperty("bookName")]
    public string BookName { get; set; }
    
    [JsonProperty("name")]
    private string Name
    {
        get => BookName;
        set => BookName = value;
    }
}

Demo

【讨论】:

  • 请注意,如果 Json 中同时存在这两个属性,则只会保留最后一个。
猜你喜欢
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多