我正在从 API 检索 JSON。我正在使用 newtonsoft (这是 json.net 对吗?)将其反序列化为对象列表。有用。
不幸的是,我还需要将其作为 JSON 传递给其他人(他们不能直接调用 API,只有我有权访问它)。我说不幸的是,因为我需要输出与收到的 JSON 不同的 JSON(属性名称需要不同)。
例如,我有一个名为 Person 的类,其属性名为 Name。我想要获取“People”,因此我向该 API 发出请求以获取上述 JSON,并返回 Person 列表。不幸的是,API 不会返回具有 Name 属性的人员,而是返回 pname。因此,为了绘制此图,我只需执行以下操作:
[JsonProperty("pname")]
这一切都很好 - 它将 pname 转换为 name,我的类现在有了价值!我有一份有名字的人的名单。
现在我需要将此对象列表作为“名称”返回给其他人,但是当我将人员类序列化回 JSON 时,当我真正想将其写为“名称”时,它会将 JSON 写为“pname” 。我怀疑它正在获取“JsonProperty”。
有没有办法让它使用 pname 进行反序列化,但使用原始属性值进行序列化?
Thanks!
您可以创建一个自定义协定解析器,将属性名称设置回您在序列化之前在 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)