java - 如何在 Jersey 中反序列化对象字段

标签 java json rest jersey jax-rs

我无法使用带有 JSON 数据表示形式的 Jersey 来反序列化对象字段。 “数据”字段可以包含整数、字符串、字符串列表……或任何其他 JAXB 标记对象。

这是我的代码:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ReturnValue{    

    private Object data;

    public ReturnValue() { }

    public ReturnValue(Object data) {
        this.data = data;
    }

    public Object getData() {
        return data;
    }

    @Override
    public String toString() {
        return "ReturnValue [data=" + data + "]";
    }

}

客户端如下所示:

public class MyClient {

    private String location = "http://localhost:9998/test";
    private Client client;
    private WebResource resource;

    public MyClient() {
        init();
    }

    private void init() {
        ClientConfig clientConfig = new DefaultClientConfig();
        clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
        client = Client.create(clientConfig);
        resource = client.resource(location);
    }

    private void test() {
        ClientResponse response = resource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
        ReturnValue value = response.getEntity(ReturnValue.class);
        System.out.println(value);
    }

    public static void main(String[] args) {
        MyClient client = new MyClient();
        client.test();
    }

}

这就是资源:

@Singleton
@Path("/test")
public class Test {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Object get() {
        return Response.ok(new ReturnValue("TEST_SERVER")).build();
    }

}

序列化的对象看起来正确:

{"data":{"@type":"xs:string","$":"TEST_SERVER"}}

这是控制台上的输出:

ReturnValue [data={@type=xs:string, $=TEST_SERVER}]

如您所见,字符串未实例化。我可以做什么来解决我的问题?

最佳答案

问题是您在 ReturnValue 中使用 java.lang.Object 作为 data 的类型。因此,JAXB 会将结果与数据类型(实际上是 String)一起编码,以便它知道如何在客户端解编您的对象。

以下代码使用您初始的ReturnValue:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
JAXB.marshal(new ReturnValue("cvb"), baos);
System.out.println(new String(baos.toByteArray()));

将产生此输出(请参阅 xsi:type="xs:string"):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<returnValue>
    <data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">cvb</data>
</returnValue>

,但如果将数据属性的类型更改为 String,由于 Jaxb 处理字符串和基元的方式,它看起来会像这样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<returnValue>
    <data>cvb</data>
</returnValue>

类似,你测试会输出:

TEST_SERVER

关于java - 如何在 Jersey 中反序列化对象字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12895065/

相关文章:

javascript - 将 JSON 对象传递给函数时出现问题

javascript - 关键是在触发 ractive.set 后将 Promise 显示为值

java - 通过json内的rest api发送pdf数据

java - Android Socket不发送数据

java - 带有 CheckGroup 的 CheckBoxMultipleChoice

使用 Maven 在 Eclipse 中运行 Pig 时出现 java.lang.VerifyError

java - 没有关系的 Hibernate 惰性对象

java - Java编译器说找不到符号。为什么?

python - 在 Python 中将 CSV 数据转换为嵌套的 JSON

rest - 同一基于 Tomcat 的应用程序中的 Web 套接字和 Rest API