【问题标题】:Jackson: Get entire object in custom field JsonDeserializer杰克逊:在自定义字段 JsonDeserializer 中获取整个对象
【发布时间】:2016-05-11 11:22:41
【问题描述】:

我有这门课:

@JsonIgnoreProperties(ignoreUnknown = true)
public class VehicleRestModel implements RestModel<Article> {

    @JsonProperty("idVehicle")
    public String id;

    public String name;
}

我从 REST API 得到这个 JSON:

[
  { "idVehicle" : "1234DHR", "tm" : "Hyundai", "model" : "Oskarsuko"},
  //more vehicles
]

我希望我的模型字段 name 是 JSON 字段 tmmodel 连接。我虽然使用了JsonDeserializer,但是如何才能将整个 JSON 对象放入其中?

class MyDeserializer implements JsonDeserializer<String, String> {

    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        // I need the entire JSON here, in order to concatenate two fields
    }
}

谢谢!

【问题讨论】:

    标签: java json jackson json-deserialization


    【解决方案1】:

    如果我理解您的问题,您可以有 2 个在同一个私有字段上工作的设置器,然后您可以使用 @JsonProperty 而不是该字段来标记设置器。 这可以帮助你:@JsonProperty annotation on field as well as getter/setter

    您也可以使用@JsonGetter("var") 和@JsonSetter("var") 来代替@JsonProperty。

    编辑:好的,一个解决方案。这是我提交过的最丑的代码,但是如果你想要一个快速的东西并且你不能真正修改POJO原始接口(字段,getter)

    public class VehicleRestModel {
    
        private String concatValue = "";
        private int splitIndex;   
    
        @JsonSetter("var1")
        public setVar1(String var1){ concatValue = var1 + concatValue.substring(splitIndex,concatValue.length()); ; splitIndex = var1.length(); }
        @JsonSetter("var2")
        public setVar2(String var2){ concatValue = concatValue.substring(0,splitIndex) + var2; }
    
    }
    

    如果你在乎的话,请小心使用空值,因为它们会在此演示代码中作为文字附加。

    【讨论】:

    • 感谢您的回答。我希望我的字段namejson.t + json.model。我怎样才能帮助我您的解决方案?请解释一下。
    • 如果您想要一个快速的解决方案,只需在设置器上使用 @JsonProperty 而不是字段。然后使用某种同步机制来设置 concat 值。如果您甚至可以更改 POJO,只需创建 2 个私有字段,然后在 getter 级别进行连接
    • @bigdestroyer 我的意思是,当您可以拥有 tmmodel @JsonProperty 字段(例如 ìd)然后只需使用 public String getConcat() 方法时,您真的需要 name 变量吗?返回两个字段的连接?
    • 好吧,这不是生死攸关的问题,但这样会很好,因为我永远不需要分开的两个字段。但是,当然,如果没有解决方案来实现这一点,我会使用你的解决方案。
    • 我编辑添加了一个您想要的解决方案,但我真的鼓励您使用私有字段,存储两个变量,并使用一个公共 getter,它在调用时即时进行连接。这样,您就可以将序列化逻辑与对象的格式字段分离。同样使用提供的解决方案,如果您需要再次序列化,您将不得不进一步工作,因为您需要再次手动将字段拆分为 2 个 json var
    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 2017-04-21
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2023-04-07
    相关资源
    最近更新 更多