c# - JsonProperty - 使用不同的名称进行反序列化,但使用原始名称进行序列化?

标签 c# json serialization json.net deserialization

我正在从 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/

相关文章:

java - GSON : Treat Empty String as null

java - 如何使用 jax -rs 创建 POST 请求

json - 如何在 Rust 中反序列化 JSON 中的 &str 结构字段

c# - 我如何尝试创建一个文件,并返回一个值来指示它是否已创建?

c# - 有谁知道 WP7 的 "Known issues"wiki

c# - C# 中的 Liang-Barsky?

mysql - 如何将 MySQL JSON 数组中的字符串值转换为大写?

python - Django REST 框架元组被解释为字符串?

java - 区分相同序列化对象的最简洁方法是什么?

c# - Entity Framework 4 中的简单条件 LINQ 查询