簡體   English   中英

在自定義類中使用Jackson的ObjectMapper

[英]Using Jackson's ObjectMapper inside Custom Class

我有一個像這樣的課程:

@Data
public class Lmao {
   String lol;
   String lel;

   public String getJsonString() throws Exception {
       ObjectMapper objectMapper = new ObjectMapper();
       return objectMapper.writeValueAsString(this);
   }
}

但是,當我調用getJsonString()方法時,出現以下錯誤:

java.lang.StackOverflowError
    at com.fasterxml.jackson.databind.introspect.AnnotatedClass._findFields(AnnotatedClass.java:795)
    at com.fasterxml.jackson.databind.introspect.AnnotatedClass._findFields(AnnotatedClass.java:802)
    at com.fasterxml.jackson.databind.introspect.AnnotatedClass.resolveFields(AnnotatedClass.java:571)
    at com.fasterxml.jackson.databind.introspect.AnnotatedClass.fields(AnnotatedClass.java:353)
    at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addFields(POJOPropertiesCollector.java:350)
    at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:283)
    at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getJsonValueMethod(POJOPropertiesCollector.java:169)
    at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findJsonValueMethod(BasicBeanDescription.java:223)
    at com.fasterxml.jackson.databind.ser.BasicSerializerFactory.findSerializerByAnnotations(BasicSerializerFactory.java:349)
    at com.fasterxml.jackson.databind.ser.BeanSerializerFactory._createSerializer2(BeanSerializerFactory.java:208)
    at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:157)
    at com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:1215)
    at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1167)
    at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:490)
    at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:688)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:107)
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3613)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2980)

無論如何,我可以在類本身內部調用Jackson的ObjectMapper,以便更好地將Json String與對象本身聯系起來嗎?

編輯:我忘了提到我在這里使用lombok的數據,因此不需要每個屬性的設置器和獲取器。

可以,但是您需要使其忽略jsonString屬性,以避免無休止的遞歸調用。 @JsonIgnore添加到getter。 或命名您的方法,使其不再是屬性,例如toJson() (這也是一個更好的名稱,IMO)。

也就是說,每次都創建一個新的ObjectMapper並不是一個好主意。 相反,您應該重新使用一勞永逸地構造的同一個。

您需要執行以下操作:

  • 編寫getter和setter
  • 注釋getJsonString@JsonIgnore

下面應該工作:

public class Test {

    String lol;
    String lel;

    @JsonIgnore
    public String getJsonString() throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.writeValueAsString(this);
    }

    public String getLol() {
        return lol;
    }


    public void setLol(String lol) {
        this.lol = lol;
    }


    public String getLel() {
        return lel;
    }


    public void setLel(String lel) {
        this.lel = lel;
    }

    public static void main(String[] args) throws Exception{
        Test t = new Test();
        System.out.println(t.getJsonString());
    }
}

將您的getJsonString()重命名為toJsonString()

ObjectMapper認為您的bean中有一個屬性jsonString 它嘗試通過getter調用它。 這導致無休止的通話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM