我正在从 API 检索 JSON。我正在使用 newtonsoft(这是 json.net 对吗?)将其反序列化为对象列表。有用。
不幸的是,我还需要将它作为 JSON 传递给其他人(他们不能直接调用 API,只有我可以访问它)。我说很遗憾,因为我需要输出与接收到的不同的 JSON(属性名称需要不同)。
例如,我有一个名为 Person 的类,它有一个名为 Name 的属性。我想获得“People”,所以我向该 API 发出请求以获取上述 JSON,并取回 Person 列表。不幸的是,API 不会返回具有 Name 属性的人,它会返回 pname。所以要映射这个,我只是这样做:
[JsonProperty("pname")]
一切都很好 - 它将 pname 转换为 name,我的类现在有了值!我有一个有名字的人的名单。
现在我需要将此对象列表作为“名称”返回给其他人,但是当我将我的人员类序列化回 JSON 时,它会将 JSON 写为“pname”,而我真的想将其写为“名称”。我怀疑它正在获取“JsonProperty”。
有没有办法让它只使用pname进行反序列化,而使用原始属性值进行序列化?
谢谢!
最佳答案
您可以创建一个自定义契约解析器,将属性名称设置回您在序列化之前在 C# 类中定义的名称。下面是一些示例代码;
class OriginalNameContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
// Let the base class create all the JsonProperties
IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);
// assign the C# property name
foreach (JsonProperty prop in list)
{
prop.PropertyName = prop.UnderlyingName;
}
return list;
}
}
这样使用;
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
if (useLongNames)
{
settings.ContractResolver = new OriginalNameContractResolver();
}
string response = JsonConvert.SerializeObject(obj, settings);
关于c# - JsonProperty - 使用不同的名称进行反序列化,但使用原始名称进行序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22993576/