我试图通过程序员布鲁斯的一个教程来完成,该教程应该允许多态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);
有没有人遇到过这个问题,如果有的话,是否有解决方案?
我很感激任何人都可以给予任何帮助.
我正在使用杰克逊,我遇到了问题,当我尝试反序列化一个对象时,我收到以下错误:
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)
谁能帮助我?
我有一个抽象类Instance
,然后两个实现,UserInstance
和HardwareInstance
.我遇到的问题是,当我将其余端点调用@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 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) 我正在尝试使用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的一部分,而不是将注释添加到类本身,因为我无法访问它。
jackson ×5
java ×5
json ×2
spring ×2
hibernate ×1
jpa ×1
polymorphism ×1
rest ×1
spring-boot ×1