其他分享
首页 > 其他分享> > CodeGo.net> JsonProperty-使用不同的名称进行反序列化,但使用原始名称进行序列化?

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

作者:互联网

我正在从API检索JSON.我正在使用newtonsoft(这是json.net吗?)将其反序列化为对象列表.有用.

不幸的是,我还需要将此作为JSON传递给其他人(只有我有权访问它们才能直接调用API).我说不幸的是,因为我需要输出与接收到的JSON不同的JSON(属性名称必须不同).

例如,我有一个名为Person的类,具有一个名为Name的属性.我想获取“人物”,因此我向该API发出请求,以获取上述JSON,并获取“人物”列表.不幸的是,API并没有向我返回具有Name属性的人员,而是向我返回了pname.因此,要对此进行映射,我只需执行以下操作:

 [JsonProperty("pname")]

一切都很好-它将pname转换为name,而我的班级现在有了值!我有一个有名字的人的名单.

现在,我需要将此对象列表作为“名称”返回给其他人,但是当我将people类序列化回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);

标签:serialization,json-net,deserialization,json,c
来源: https://codeday.me/bug/20191121/2055062.html