gpt4 book ai didi

java - Jersey 和 Genson 的 JSON 对象问题

转载 作者:行者123 更新时间:2023-12-01 12:12:27 25 4
gpt4 key购买 nike

尝试使用 Jersey 和 Genson 执行 POST 调用时遇到以下问题:

....com.owlike.genson.JsonBindingException:未找到类型接口(interface) Animal 的构造函数....

我有以下设置:

-> Animal.java

package com.test;

import org.codehaus.jackson.annotate.JsonSubTypes;
import org.codehaus.jackson.annotate.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes( {@JsonSubTypes.Type(value = Dog.class, name = "dog") })
public interface Animal
{ }

-> Dog.java

package com.test;

import org.codehaus.jackson.annotate.JsonTypeName;
import org.codehaus.jackson.annotate.JsonProperty;

@JsonTypeName("dog")
public class Dog implements Animal
{
@JsonProperty
public String name;

public String getName() { return name; }
public void setName(String n) { this.name = n; }
}

-> Zoo.java

package com.test;

import java.util.List;

public class Zoo
{
private List<Animal> animals;
public List<Animal> getAnimals()
{
return animals;
}

public void setAnimals(List<Animal> animals)
{
this.animals = animals;
}
}

-> GensonCustomResolver.java

package com.test;
import javax.ws.rs.next.ContextResolver;
import javax.ws.rs.next.Provider;

import com.owlike.genson.Genson;

@Provider
public class GensonCustomResolver implements ContextResolver<Genson>
{
private final Genson genson = new Genson.Builder().useRuntimeType(true).useClassMetadata(true).create();

@Override
public Genson getContext(Class<?> arg0)
{
return genson;
}
}

-> JerseyService.java

package com.test;

import javax.ws.rs.*;
import org.codehaus.jackson.*;

@Path("/exampleservice")
public class JerseyService
{


@POST
@Path("somePath")
@Consumer(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Zoo createAnotherZoo(Zoo zoo) throws JsonParseException, JsonMappingException, Exception
{
Zoo newZoo = new Zoo();
Collection<Animal> animals = zoo.getAnimals();
List<Animal> newAnimals = new ArrayList<Animal>();

for (Animal a : animals) {
Dog dog_a = (Dog) a;
Dog dog_b = new Dog();
dog_b.setName(dog_a.getName() + "TEST");
newAnimals.add(dog_b);
}
newZoo.add(newAnimals);
return newZoo;
}
}

输入 JSON 如下所示:

{
"animals" : [
{
"name": "Unno"
}
]
}

总而言之,我有一个列表,并且在反序列化对象时尝试使用其中一个接口(interface)实现。

提前谢谢您。

::::解决方案:::::

如果有人遇到这种情况:

我按照下面的建议完全删除了 genson 依赖项。只使用了 jackson 注释,它似乎有效。我还从 Dog.java 中的 name 属性中删除了 @JsonProperty。

谢谢:):)

最佳答案

我认为您的意思是“我在反序列化我的对象时尝试使用其中一个接口(interface)实现。”

你的问题

如果这就是您的意思,那么简短的答案是它不能那样工作。

  1. 我看到您正在使用 Jackson 注释,Genson 没有看到/使用这些注释(jackson 和 genson 是两个不同的库)。

  2. 根据 json 流(您提供的示例输入),Genson 无法知道要绑定(bind)哪个具体类

<小时/>

一些可能的解决方案是

  • 如果您在两端使用相同的 pojos(动物、狗等)和 Genson(将数据发布到服务器和服务器的代码),则使用启用了 useRuntimeType 和 useClassMetadata 的 Genson 实例两端应该可以工作。这将是最简单的解决方案。

    • 类元数据机制,在序列化期间写入 json 对象作为具体类型的类名的第一个条目,在反序列化期间 Genson 查找带有键 @class 的第一个属性来提取具体的类名。在您的情况下,如果您能够生成 {"animals":{"@class": "com.test.Dog", "name": "Unno"}} 形式的 json,那么 genson 会将其传递给正确的类型。请注意,您还可以为类型注册别名,因此您可以只写狗而不是完整的类名。更多详情请参见the documentation

    • 由于您有这些 Jackson 注释来提供类型提示,那么您还可以使用 jackson 来处理 deser(请注意,输入 json 不适用于此配置,因为它似乎不包含通过定义的信息的注释)。在这种情况下,您不应该使用 Genson 来处理带有 jersey 的 ser/de,因为 jackson 和 genson 执行相同的工作。

关于java - Jersey 和 Genson 的 JSON 对象问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27197211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com