java - 使用 Jackson 生成 JSON 模式进入无限循环

标签 java json jackson jsonschema

可能是我在 Jackson 中遗漏了一个明显的注释,但我有以下类(class)

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.jsonschema.JsonSchema;

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Loop {

  private String name;
  private Loop otherLoop;

  public String getName() { return name; }
  public void setName(String name) { this.name = name; }
  public Loop getOtherLoop() { return otherLoop; }
  public void setOtherLoop(Loop otherLoop) { this.otherLoop = otherLoop; }

  public static void main(String[] args) throws Exception {
    Loop parent = new Loop();
    parent.setName("parent");

    Loop child = new Loop();
    child.setName("child");
    child.setOtherLoop(parent);

    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writeValueAsString(child));

    JsonSchema jsonSchema = mapper.generateJsonSchema(Loop.class);
    System.out.println(mapper.writeValueAsString(jsonSchema));
  }
}

当我使用 Jackson 2 运行它时,它进入了无限循环

{"name":"child","otherLoop":{"name":"parent"}}
Exception in thread "main" java.lang.StackOverflowError
at com.fasterxml.jackson.databind.cfg.MapperConfig.isEnabled(MapperConfig.java:106)
at com.fasterxml.jackson.databind.SerializationConfig.getAnnotationIntrospector(SerializationConfig.java:382)
at com.fasterxml.jackson.databind.SerializerProvider.getAnnotationIntrospector(SerializerProvider.java:307)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.createContextual(BeanSerializerBase.java:318)
at com.fasterxml.jackson.databind.SerializerProvider._handleContextual(SerializerProvider.java:971)
at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:447)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.getSchema(BeanSerializerBase.java:619)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.getSchema(BeanSerializerBase.java:621)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.getSchema(BeanSerializerBase.java:621)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.getSchema(BeanSerializerBase.java:621)

任何想法,解决方法?!

最佳答案

@XmlAccessorType(XmlAccessType.FIELD)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Loop {
   @XMLAttribute(name = "Name")
   private String name;
   @XMLAttribute(name = "Loops")
   private List<Loop> listLoop;

   //getters and setters    
}

关于java - 使用 Jackson 生成 JSON 模式进入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12055285/

相关文章:

java - java调用栈的最大深度是多少?

java - 请求的列表键 'countries' 无法解析为集合/数组/映射/枚举/迭代器类型。示例 : people or people. {名称}

java - Jersey 将字符值序列化为 ASCII 等效数字字符串

java - jackson JsonMappingException : Invalid type id

java - 在 spring security 中使用 session id 检索身份验证对象

java - 管道和发布与快照构建

使用express JS进行JSON漏洞防护

javascript - JS+REST+NodeJS : How to parse a JSON list from a JSON object

javascript - 如何访问嵌套的 json 数组以获取每个对象中所有参数的所有值的列表

java - 为什么迁移到 Java 11 后, header "Accept: application/xml"在 Spring Boot 中不起作用?