当前位置: 首页 > 面试题库 >

在Java REST中解析JSON参数时出错

权烨磊
2023-03-14
问题内容

我最近将REST API升级为使用jersey
2.x,现在我无法以以前的方式检索JSON主体参数,因此不再调用这些方法。我的猜测是我缺少将JSON解析为java对象的依赖项,但是我不太确定我需要添加什么,任何帮助都值得赞赏。

pom.xml

<dependencies>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.19</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.19</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.19</version>
    </dependency>
    <dependency>
        <groupId>com.googlecode.json-simple</groupId>
        <artifactId>json-simple</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.22</version>
    </dependency>
</dependencies>

REST方式

@POST
    @Path("/users/{userId}/friends")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response followUser(@PathParam("userId") Integer myUserId, FollowUserBean user) {}

FollowUserBean.java

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class FollowUserBean {
    public Integer friendId;

    public FollowUserBean() {}
}

问题答案:

您需要一个JSON提供程序

在撰写本文时,Jersey 2.x与以下模块集成以提供JSON支持:

  • 莫西
  • JSON处理的Java API(JSON-P)
  • 杰克逊
  • 抛弃

使用杰克逊

请参阅以下将Jackson用作Jersey 2.x的JSON提供程序所需的步骤:

添加Jackson模块依赖项

要将Jackson 2.x用作JSON提供程序,您需要jersey-media-json- jacksonpom.xml文件中添加模块:

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

要使用Jackson 1.x,它将类似于:

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

注册Jackson模块

除了添加上述依赖之外,您还需要在/
子类中注册JacksonFeature(或Jackson1Feature对于Jackson
1.x):ApplicationResourceConfig

@ApplicationPath("/api")
public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(JacksonFeature.class);
        return classes;
    }
}



@ApplicationPath("/api")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        register(JacksonFeature.class);
    }
}

如果没有Application/
ResourceConfig子类,则可以JacksonFeatureweb.xml部署描述符中注册。可以在初始化参数的
逗号分隔值
中提供特定的资源,提供者和功能完全合格的类名称jersey.config.server.provider.classnames

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
</init-param>

MessageBodyWriter杰克逊提供的是JacksonJsonProvider

有关更多详细信息,请参阅Jersey
文档中有关常见媒体类型表示形式的支持。



 类似资料:
  • 问题内容: 我有一个,尝试检索并解析它,但出现此错误: 这是我的功能: 怎么了?我花了两天时间来解决这个问题。有时我会遇到空值,但我不知道如何使用它们。 问题答案: 添加与null测试不同的简单方法。 那你还有问题吗?

  • 我尝试了以下get方法:swift JSON登录REST with post和get响应示例 代码: 我得到了一个输出:试图将数据转换为JSON时出错… 服务2的描述是:这是对服务2的描述。这是对服务2的描述这是对服务2的描述。

  • 我尝试了不同的方法在Android中解析JSON文件,但在打印出来时出现了错误。 这是我的整个JSON文件: 以下是我为使其正常工作而实现的代码: 这是onPostExecute方法: 我已经从这个网站的帮助来布局我的功能:https://www.androidhive.info/2012/01/android-json-parsing-tutorial/

  • 问题内容: 我有提供URL作为参数的REST客户端。但是我的云REST基础架构仅接受JSON格式。 有没有办法在Java中将URL参数转换(解析)为JSON格式? URL参数示例: 转换为JSON格式,例如: 问题答案: 解决方案 没有开箱即用的解决方案,因此开发一种解决方法最实用。 这是一个参数到JSON的转换器方法: 结果 方法输入: 方法返回输出:

  • 问题内容: 我是Jquery,Ajax和JSON的新手。我在解析Json数据时遇到问题。我在Stackoverflow上遇到了很多问题 解析HTML表的JSON对象 访问/处理(嵌套的)对象,数组或JSON 在JavaScript中解析JSON? 如何在JQuery中解析此JSON对象? 还有很多… 我仍然无法解析Json数据。 我的Jquery看起来像: 我已经尝试了所有组合来解析此数据,但是j

  • 问题内容: 我正在使用一个API,该API返回如下所示的JSON 在Swift中,我使用两个函数来获取并解析JSON 然后我用 可以很好地解析JSON。当我打印出 我得到了数组的所有内容。但是,我无法访问每个单独的索引。我很肯定这是一个数组,因为我之间 返回正确的长度。但是,如果我尝试通过使用访问单个索引 XCode关闭语法高亮显示并给我以下信息: 并且代码将无法编译。 这是XCode 6的错误,