【问题标题】:Using JsonProperty for Deserializing but NOT serializing [duplicate]使用 JsonProperty 进行反序列化但不序列化 [重复]
【发布时间】:2019-08-27 09:27:57
【问题描述】:

我有一个调用 REST-Api 的后端服务。然后将该 API 的结果反序列化到我的实体中:

public class Item {
  [JsonProperty("pkID")]
  public int Id {get;set;}
}

JsonConvert.DeserializeObject<Item>(responseString);

这很好用。但我也想将结果作为 JSON 字符串返回,以便我可以从前端使用它。现在,当使用JsonConvert.SerializeObject(item) 序列化我的“项目”类型的对象时,我想返回类似

{ Id: 1 }

在序列化时它还使用 JsonProperty 并返回

{ pkID: 1 }

改为。

如何告诉序列化程序在序列化时忽略 JsonProperty,但在反序列化时使用它?

我不是在寻找是否应该序列化属性的方法,而是在寻找是否应该使用 propertyName 或序列化时 JsonProperty 中的名称。

【问题讨论】:

  • 在您链接的问题中,根本没有序列化该属性。我正在寻求一种方法来保留 PropertyName
  • @OleAlbers 有一个指向 IContractResolver 的指针,它可以帮助你做你正在做的这些奇怪的事情
  • @vasily.sib 我按照描述和 AFAIK(我可能在这里错了)看起来这是关于序列化或不序列化属性,而不是属性应该具有的名称。
  • 还有 2 件事要尝试:1 - 让您的前端使用 pkID 而不是 Id。 2 - 为您的前端创建另一个 Item 类。

标签: c# json serialization deserialization


【解决方案1】:

您可以使用指向“好”属性的仅设置属性。

public class Item
{
    public int Id { get; set; }

    [JsonProperty("pkID")]
    public int BackwardCompatibleId { set => Id = value; }
}

// test
var x = new Item { Id = 88 };
var json = JsonConvert.SerializeObject(x); // {"Id":88}
var clone = JsonConvert.DeserializeObject<Item>("{\"pkId\":99}");

【讨论】:

  • 虽然这确实有效,但我想这样做的主要原因是应该使用 Pascal-Casing 的“干净”代码,而不是让 REST 接口强迫我使用“坏”命名
  • 好点。正如您在问题中所做的那样,我使用 JsonPropertyAttribute 更新了答案。您还可以尝试将“BackwardCompatibleId”设为私有,以对其他类隐藏此“hack”。
【解决方案2】:

您可以使用自己的 ContractResolver 实现。

这是一个可能有效的答案:https://stackoverflow.com/a/20639697/5018895

【讨论】:

  • 谢谢。这真的是我的问题的重复
猜你喜欢
  • 1970-01-01
  • 2014-05-24
  • 2012-12-18
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2021-05-08
相关资源
最近更新 更多