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

时间:2014-04-10 16:19:54

标签: c# json serialization json.net deserialization

我正在从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进行反序列化,但是使用原始属性值进行序列化?

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以创建自定义合约解析程序,将属性名称设置回您在服务之前在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);

答案 1 :(得分:0)

您可以使用一个Person类编写自定义JsonConverter,但我建议使用单独的类,因为这两个地方的数据建模方式不同。即使您现在不打算,也可能会发现自己需要从Name反序列化或在某个时候序列化为pname。这也使您的课程差别更大。您可以使用AutoMapper(或类似)轻松地在两者之间进行转换。 E.g。

public class PersonFromThatApi
{
    [JsonProperty("pname")]
    public string Name { get; set; }
}
public class Person
{
    public string Name { get; set; }
}

Mapper.CreateMap<PersonFromThatApi, Person>();
Mapper.CreateMap<Person, PersonFromThatApi>();

var person1 = JsonConvert.DeserializeObject<PersonFromThatApi>(
                               @"{""pname"":""George""}");
Person person2 = Mapper.Map<Person>(person1);
string s = JsonConvert.SerializeObject(person2); // {"Name":"George"}

是的,Newtonsoft.JsonJson.NET的命名空间。不要问我为什么他们为这两件事选择完全不同的名字。