相关疑难解决方法(0)

用杰克逊将JSON反序列化为多态类型 - 完整示例给出了编译错误

我试图通过程序员布鲁斯的一个教程来完成,该教程应该允许多态JSON的反序列化.

完整的列表可以在这里找到 程序员布鲁斯教程(伟大的东西顺便说一句)

我已经完成了前五个没有问题,但我在最后一个(示例6)遇到了障碍,当然这是我真正需要工作的那个.

我在编译时遇到以下错误

ObjectMapper类型中的方法readValue(JsonParser,Class)不适用于参数(ObjectNode,Class)

它是由大量代码引起的

  public Animal deserialize(  
      JsonParser jp, DeserializationContext ctxt)   
      throws IOException, JsonProcessingException  
  {  
    ObjectMapper mapper = (ObjectMapper) jp.getCodec();  
    ObjectNode root = (ObjectNode) mapper.readTree(jp);  
    Class<? extends Animal> animalClass = null;  
    Iterator<Entry<String, JsonNode>> elementsIterator =   
        root.getFields();  
    while (elementsIterator.hasNext())  
    {  
      Entry<String, JsonNode> element=elementsIterator.next();  
      String name = element.getKey();  
      if (registry.containsKey(name))  
      {  
        animalClass = registry.get(name);  
        break;  
      }  
    }  
    if (animalClass == null) return null;  
    return mapper.readValue(root, animalClass);
  }  
} 
Run Code Online (Sandbox Code Playgroud)

具体由行

return mapper.readValue(root,animalClass);

有没有人遇到过这个问题,如果有的话,是否有解决方案?

我很感激任何人都可以给予任何帮助.

java polymorphism json compiler-errors jackson

62
推荐指数
4
解决办法
8万
查看次数

无法构建 - 杰克逊的实例

我正在使用杰克逊,我遇到了问题,当我尝试反序列化一个对象时,我收到以下错误:

com.fasterxml.jackson.databind.JsonMappingException: 
    Can not construct instance of net.MyAbstractClass, 
    problem: abstract types either need to be mapped to concrete types, 
        have custom deserializer, or be instantiated with additional type information
Run Code Online (Sandbox Code Playgroud)

我在属性中遇到问题:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "@id")
@JsonSubTypes({ @JsonSubTypes.Type(value = MyAbstractClass.class, name = "MyAbstractClass") })
@ManyToOne
private MyAbstractClass object;
Run Code Online (Sandbox Code Playgroud)

谁能帮助我?

java jackson

44
推荐指数
5
解决办法
12万
查看次数

杰克逊对多种类型的反序列化

我有一个抽象类Instance,然后两个实现,UserInstanceHardwareInstance.我遇到的问题是,当我将其余端点调用@POST到数据库中时,我理想地希望它.../rest/soexample/instance/create与实例传递到REST端点的位置相同.如果Instance不是带有多个实现的抽象,那就没问题了,但是因为我有2个,所以我得到了一个Jackson.databind错误.

"问题:抽象类型需要映射到具体类型,具有自定义反序列化器,或者使用其他类型信息进行实例化"

在找到解决方案之后我找到了一个SO答案,说我可以使用类似的东西:

@JsonDeserialize(as=UserInstance.class)

但是,如果有一个抽象类的实现,它似乎是非常有用的.假设我不能两次调用它,因为它无法确定它将是哪种类型的实例.

所以我想知道处理这种情况的最佳方法是什么?我应该创建不同的端点吗?喜欢:

.../rest/soexample/userinstance/create & .../rest/soexample/hardwareinstance/create

我不太确定,因为我是一个noobie @ REST相关的东西,虽然积极尝试学习.谢谢!

java rest json jackson deserialization

14
推荐指数
1
解决办法
2万
查看次数

杰克逊:将一个物体称为财产

在我的java spring应用程序中,我正在使用hibernate和jpa,我使用jackson在DB中填充数据.

这是User类:

@Data
@Entity
public class User{

    @Id
    @GeneratedValue
    Long id;

    String username;
    String password;
    boolean activated;

    public User(){}
}
Run Code Online (Sandbox Code Playgroud)

第二类是:

@Entity
@Data
public class Roles {

    @Id
    @GeneratedValue
    Long id;

    @OneToOne
    User user;

    String role;

    public Roles(){}


}
Run Code Online (Sandbox Code Playgroud)

在Roles类中,我有一个User属性, 然后我创建了一个json文件来存储数据:

[ {"_class" : "com.example.domains.User", "id": 1, "username": "Admin", "password": "123Admin123","activated":true}
,
  {"_class" : "com.example.domains.Roles", "id": 1,"user":1, "role": "Admin"}]
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我运行应用程序时,它抱怨:

.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.example.domains.User: no int/Int-argument constructor/factory method to deserialize from Number value (1)
 at …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jpa jackson

13
推荐指数
3
解决办法
4026
查看次数

杰克逊反序列化抽象类

我正在尝试使用JSON ObjectMapper反序列化对象。尝试反序列化时出现以下错误

com.fasterxml.jackson.databind.JsonMappingException:无法构造com.phoenix.types.OrderItem的实例:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,或者包含其他类型信息,请参见[来源:java.io .StringReader @ 4bb33f74; 行:112,列:7](通过参考链:com.phoenix.types.GenerateRequest [“ order”]-> com.phoenix.types.Order [“ orderItems”]-> Object [] [0]) .fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:261)位于com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456)位于com.fasterxml.jackson.databind.DeserializationContext.handle(MissingInstator) .java:1012),请访问com.fasterxml.jackson.databind.deser。

我碰到过该帖子,介绍了多态反序列化。这基本上为解决上面列出的错误提供了解决方案。我用于反序列化的类(在这种情况下为OrderItem等)是jar文件的一部分。但是,在尝试反序列化时,有一种方法可以将JsonDeserialize定义为objectmapper的一部分,而不是将注释添加到类本身,因为我无法访问它。

java spring jackson spring-boot

4
推荐指数
1
解决办法
8603
查看次数