当前位置: 首页 > 面试题库 >

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

娄森
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 我正在从如下所示的Web API接收JSON数据: 我将此数据反序列化为以下类型的对象: 稍后在我的应用程序中,我想再次将ErrorDetails对象序列化为JSON,但使用属性名称代替。因此结果将如下所示: 有什么简单的方法可以使用Json.Net完成此操作?也许使用自定义解析器和一些属性,例如: 但是解析器不会告诉我何时进行序列化或反序列化。 问题答案: 您可以使用,Contrac

  • 问题内容: 我的课有一个属性’PropertyA’,我希望它在序列化时在JSON对象中显示为’PropertyB’。我可以使用某种属性吗? 问题答案: 对于与使用: 确保您的课程也用属性修饰。 如果您使用的是JavaScriptSerializer,则需要创建派生的实现

  • 问题内容: 有没有办法强迫杰克逊不将类名放在Json输出中?我问了一个问题,导致这个问题,但我要问什么,我希望是一个更集中的问题。我在执行此操作时正在使用Spring MVC,但是我不确定这有多重要。 所以,代替 我想要 我可能更喜欢前者,但是我不知道如何在反序列化时让Jackson识别类名,所以如果有人知道,那也会有所帮助。 问题答案: 感谢http://pascaldimassimo.com/

  • 问题内容: 我整天都在寻找可以解决这个问题的东西,但是到目前为止我还没有碰到很多运气。 我的问题很简单:如何使用Jackson正确反序列化匿名对象。 在出现异常之前,此输出为:JSON = [“ com.foo.test.JacksonTest $ 1”,{“ value”:5}]: 线程“主”中的异常com.fasterxml.jackson.databind.JsonMappingExcept

  • 我有一个字段,它通过类序列化为ISO-8601格式。 当我收到以下JSON时, 通过将jackson-datatype-jsr310模块包含到项目中,并使用和解决了这个问题。

  • 问题内容: 我正在尝试反序列化来自API的JSON响应。JSON如下所示(MAC地址和位置已更改): 问题在于措施措施。由于对象的名称正在更改,因此我不知道如何将其正确反序列化为C#对象。我在这里发现使用字典的解决方案存在类似问题,但是如果以这种方式尝试,我只会得到空目录。 这是我的反序列化方法: 这是APIResponse类: 有什么方法可以轻松地适当地反序列化这些措施吗? 问题答案: 看来您应