使用 JsonObject 作为 Jersey 2 响应的实体
using JsonObject as entity for Jersey 2 response
我有这个简单的代码:
package com.example
import javax.json.Json;
import javax.json.JsonObject;
...
@Path("/")
public class Resource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response defaultEntry() {
JsonObject result = (Json.createObjectBuilder()
.add("hello", "world")
.build());
return Response.status(200).entity(result.toString()).build();
}
}
我是 Java 的新手,如果我省略对 result.toString()
的调用并简单地将 result
传递给 .entity
(像这样: return Response.status(200).entity(result).build()
),我在客户端上得到 JSON,其中包括类型信息等,但不是我所期望的:
{"hello":{"chars":"world","string":"world","valueType":"STRING"}}
这是什么用意?将 JsonObject
传递给它与传递字符串有何不同?
此外,我没有在文档中找到 Response.entity
方法 (https://jersey.java.net/apidocs/2.11/jersey/javax/ws/rs/core/Response.html)。我从教程中复制了这段代码,但没有正确解释发生了什么...
我希望我能为您提供更好的答案,在更好的答案出现之前,这只是一个提示。这里有一些活动部件。 Json对象是一个接口。不描述其实现。此外,还有一个 Json 序列化程序可以将您的 returned 对象转换为 Json 文本。正是这两件事共同导致了这个 Json 模式输出。当您执行 .toString()
变体时,序列化程序只是按原样 returned 字符串。但是当你 return JsonObject 现在你有这两个动态在起作用,JsonObject 的实现和序列化器的实现。由于您使用的是 Jersey 2.0,因此您可以使用 Jackson、Moxy 或 Jettison 序列化程序。在序列化 JsonObject 时,这些都可能有不同的输出,但我们必须进行测试才能确定。此外,JsonObject 实现的配置方式可能是,当您选择的序列化程序对其进行序列化时,其输出是 Json 模式,而不是常规的 Json。这可以使用特定于所选 Json 序列化程序的注释来完成。
在我的职业生涯中,我使用了多个 Json 序列化器。杰克逊可能是那里最受欢迎的人。但我也广泛使用了 Gson。在一个项目中,我们以某种方式配置 Gson,在序列化 POJO 时,它的序列化 Json 输出作为 Json 模式出现。因此,在某些条件下拥有 Json 序列化器输出 Json 模式并不难。
序列化 POJO(又名 Java Beans)时,如果在 Java Bean 上使用序列化程序的默认设置,您会期望得到常规 Json 输出。但是,当发回可能与特定 Json 序列化器进行复杂交互的对象时,您可能会得到不同的 Json 输出。
在这种情况下,您将不得不 运行 测试以更深入地了解正在发生的事情。例如,我将首先针对与您创建的 JsonObject 匹配的 POJO 测试序列化程序。然后我还会在同一个 Json 对象上测试其他 Json 序列化程序。看看你是否能找到一个模式。
数据类型模块 jackson-datatype-jsr353 提供对 javax.json
类型的支持。该页面包含如何添加依赖项以及如何使用 Jackson 的 ObjectMapper
.
注册模块的说明
从 Jackson 2.11.0 开始,该模块移至 jackson-datatypes-misc 的保护伞下。
我有这个简单的代码:
package com.example
import javax.json.Json;
import javax.json.JsonObject;
...
@Path("/")
public class Resource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response defaultEntry() {
JsonObject result = (Json.createObjectBuilder()
.add("hello", "world")
.build());
return Response.status(200).entity(result.toString()).build();
}
}
我是 Java 的新手,如果我省略对 result.toString()
的调用并简单地将 result
传递给 .entity
(像这样: return Response.status(200).entity(result).build()
),我在客户端上得到 JSON,其中包括类型信息等,但不是我所期望的:
{"hello":{"chars":"world","string":"world","valueType":"STRING"}}
这是什么用意?将 JsonObject
传递给它与传递字符串有何不同?
此外,我没有在文档中找到 Response.entity
方法 (https://jersey.java.net/apidocs/2.11/jersey/javax/ws/rs/core/Response.html)。我从教程中复制了这段代码,但没有正确解释发生了什么...
我希望我能为您提供更好的答案,在更好的答案出现之前,这只是一个提示。这里有一些活动部件。 Json对象是一个接口。不描述其实现。此外,还有一个 Json 序列化程序可以将您的 returned 对象转换为 Json 文本。正是这两件事共同导致了这个 Json 模式输出。当您执行 .toString()
变体时,序列化程序只是按原样 returned 字符串。但是当你 return JsonObject 现在你有这两个动态在起作用,JsonObject 的实现和序列化器的实现。由于您使用的是 Jersey 2.0,因此您可以使用 Jackson、Moxy 或 Jettison 序列化程序。在序列化 JsonObject 时,这些都可能有不同的输出,但我们必须进行测试才能确定。此外,JsonObject 实现的配置方式可能是,当您选择的序列化程序对其进行序列化时,其输出是 Json 模式,而不是常规的 Json。这可以使用特定于所选 Json 序列化程序的注释来完成。
在我的职业生涯中,我使用了多个 Json 序列化器。杰克逊可能是那里最受欢迎的人。但我也广泛使用了 Gson。在一个项目中,我们以某种方式配置 Gson,在序列化 POJO 时,它的序列化 Json 输出作为 Json 模式出现。因此,在某些条件下拥有 Json 序列化器输出 Json 模式并不难。
序列化 POJO(又名 Java Beans)时,如果在 Java Bean 上使用序列化程序的默认设置,您会期望得到常规 Json 输出。但是,当发回可能与特定 Json 序列化器进行复杂交互的对象时,您可能会得到不同的 Json 输出。
在这种情况下,您将不得不 运行 测试以更深入地了解正在发生的事情。例如,我将首先针对与您创建的 JsonObject 匹配的 POJO 测试序列化程序。然后我还会在同一个 Json 对象上测试其他 Json 序列化程序。看看你是否能找到一个模式。
数据类型模块 jackson-datatype-jsr353 提供对 javax.json
类型的支持。该页面包含如何添加依赖项以及如何使用 Jackson 的 ObjectMapper
.
从 Jackson 2.11.0 开始,该模块移至 jackson-datatypes-misc 的保护伞下。