在 Jersey 中解析 JSON

2024-01-08

我有一个 JSON 字符串,其中包含多个键值对和几个单个对象,如下所示。

我正在使用 Jersey 编写一个资源类,它将读取此 JSON 并将其转换为 Java 对象,但我无法这样做。

谁能帮我编写相应的Java对象以及如何解析JSON来填充这个Java对象?

{
  "Name": "TestName",
  "MyMap": [
    {
      "key": "Color",
      "value": "red"
    },
    {
      "key": "distance",
      "value": "long"
    },
    {
      "key": "Size",
      "value": "large"
    }
  ]
}

我的资源类:

@POST
@Path("/somePath")
@Consumes(MediaType.APPLICATION_JSON)
public Response generateDetails(MyObject myObject) {
    myObject.getName();
    System.out.println("Name " + myObject.getName());
}

设计您的 POJO 以与 Jackson 一起工作

如果您愿意使用 Jackson 作为 JSON 解析器,您可以拥有以下内容:

public class RequestContent {

    @JsonProperty("Name")
    private String name;

    @JsonProperty("MyMap")
    private List<KeyValuePair> map;

    // Getters and setters ommited
}
public class KeyValuePair {

    private String key;

    private String value;

    // Getters and setters ommited
}

使用 Jackson 解析 JSON

使用 Jersey 和 Jackson,您无需使用以下命令解析 JSON 字符串ObjectMapper, 如下所示:

String json = "{\"Name\":\"TestName\",\"MyMap\":[{\"key\":\"Color\",\"value\":\"red\"},{\"key\":\"distance\",\"value\":\"long\"},{\"key\":\"Size\",\"value\":\"large\"}]}";";

ObjectMapper mapper = new ObjectMapper();
RequestContent requestContent = mapper.readValue(json, RequestContent.class);

只需确保您的资源方法如下所示,然后让杰克逊的MessageBodyReader http://docs.oracle.com/javaee/7/api/javax/ws/rs/ext/MessageBodyReader.html为您做这项工作:

@POST 
@Path("/somePath") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response generateDetails(RequestContent requestContent) {
    ...
}

JSON 解析将由JacksonJsonProvider https://github.com/FasterXML/jackson-jaxrs-json-provider/blob/master/src/main/java/com/fasterxml/jackson/jaxrs/json/JacksonJsonProvider.java类,它实现了MessageBodyReader http://docs.oracle.com/javaee/7/api/javax/ws/rs/ext/MessageBodyReader.html.

杰克逊依赖

要使用 Jackson 2.x 作为 JSON 提供程序,您需要添加jersey-media-json-jackson https://jersey.java.net/project-info/2.23.1/jersey/project/jersey-media-json-jackson/dependencies.html模块到你的pom.xml file:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.23.1</version>
</dependency>

要使用 Jackson 1.x,它看起来像:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson1</artifactId>
    <version>2.23.1</version>
</dependency>

如果您不使用 Maven,请确保拥有所有需要的依赖项(请参阅jersey-media-json-jackson https://jersey.java.net/project-info/2.23.1/jersey/project/jersey-media-json-jackson/dependencies.html or jersey-media-json-jackson1 https://jersey.java.net/project-info/2.23.1/jersey/project/jersey-media-json-jackson1/dependencies.html)在类路径上。

为了使用 Jackson 作为您的 JSON 提供程序,您需要注册JacksonFeature https://jersey.java.net/apidocs/2.23.1/jersey/org/glassfish/jersey/jackson/JacksonFeature.html (or Jackson1Feature https://jersey.java.net/apidocs/2.23.1/jersey/org/glassfish/jersey/jackson1/Jackson1Feature.html对于 Jackson 1.x) 在你的Application https://jersey.java.net/apidocs/2.23.1/jersey/javax/ws/rs/core/Application.html/ResourceConfig https://jersey.java.net/apidocs/2.23.1/jersey/org/glassfish/jersey/server/ResourceConfig.html子类。

欲了解更多详情,请查看球衣文档 https://jersey.java.net/documentation/latest/media.html关于对常见媒体类型表示的支持。

根据您的需求变更进行更新

改变RequestContent类如下:

public class RequestContent {

    @JsonProperty("Name")
    private String name;

    @JsonProperty("MyMap")
    private List<List<KeyValuePair>> map;

    // Getters and setters ommited
}

然后使用上面显示的方法之一解析 JSON。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Jersey 中解析 JSON 的相关文章