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

将javax.ws.rs实体序列化为json

司徒耀
2023-03-14
问题内容

我想通过org.glassfish.jersey实施将其序列化为Json

Map<String, String> entity = Maps.newHashMap();
entity.put("foo", "bar");

Response response = Response.status(Response.Status.OK)
                            .entity(entity)
                            .type(MediaType.APPLICATION_JSON).build();

System.out.println(response.getEntity());

该映射序列化为非标准{ foo: "bar" }。我想在单元测试中测试此行为。


问题答案:

你不能像这样测试。你在这里做什么

Response response = Response.status(Response.Status.OK)
                            .entity(entity)
                            .type(MediaType.APPLICATION_JSON).build();

正在建立 出站 响应。在JAX-RS框架中,发出响应后,例如

@GET
@Produced(MediaType.APPLICATION_JSON)
public Response getResponse() {
    ...
    return Response.status(Response.Status.OK)
                    .entity(entity)
                    .type(MediaType.APPLICATION_JSON).build();
}

它仍然需要通过MessageBodyWriter序列化到JSON。

  • 阅读有关实体提供者的更多信息

话虽如此,泽西岛有一个测试框架,我们可以用来测试我们的资源方法。您可以在Github上找到所有官方示例

一个样本(有一些改动):

这些是最低要求的Maven依赖项

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.test-framework</groupId>
        <artifactId>jersey-test-framework-core</artifactId>
        <version>2.13</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.test-framework.providers</groupId>
        <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
        <version>2.13</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.13</version>
    </dependency>
</dependencies>

测试班

public class TestJSONResource extends JerseyTest {

    @Override
    protected TestContainerFactory getTestContainerFactory() {
        return new GrizzlyTestContainerFactory();
    }

    @Path("test")
    public static class TestResource {
        @GET
        @Produces(MediaType.APPLICATION_JSON)
        public Response getJson() {
            Map<String, String> entity = Maps.newHashMap();
            entity.put("foo", "bar");

            Response response = Response.status(Response.Status.OK)
                    .entity(entity)
                    .type(MediaType.APPLICATION_JSON).build();
            return response;
        }
    }

    @Override
    protected DeploymentContext configureDeployment() {
        return DeploymentContext.builder(new ResourceConfig(TestResource.class))
                .contextPath("context1/context2")
                .build();
    }

    @Test
    public void testGet() {
        final WebTarget target = target("test");
        final String s = target.request().get(String.class);
        System.out.println(s);
    }
}

jersey-media-json- jackson提供MessageBodyWriterMessageBodyReader用于处理JSON,这对我们是隐式注册的。



 类似资料:
  • 问题内容: 我正在使用Ef 4.1,并且有一个POCO对象要序列化为JSON,我已经读到在使用延迟加载时这样做有问题,但是我不确定我可以这样做,因为一个可以的集合。 有什么办法吗?将这种对象序列化为JSON? 我的对象看起来像: 问题答案: 问题是循环引用。避免这种情况的一种简单方法是使用Json.Net http://james.newtonking.com/projects/json- net

  • 问题内容: 似乎无法使用WCF的本机DataContractJsonSerializer或ASP.NET的本机JavaScript序列化器将Entity Framework对象序列化为JSON。这是由于两个串行器都拒绝的引用计数问题。我还尝试了Json.NET,它在引用计数问题上也特别失败。 编辑: Json.NET现在可以序列化和反序列化Entity Framework实体 。 我的对象是Ent

  • 问题内容: 我正在使用Jackson将JPA模型序列化为JSON。 我有以下课程: 和 我正在使用POJO映射从模型序列化为JSON。当我序列化Parent对象时,我得到以下JSON: 但是当我序列化一个Child时,我得到以下JSON: 缺少对父级的引用。有办法解决吗? 问题答案: 我认为您必须在@JsonIdentityInfo和@ JsonBackReference / @ JsonMana

  • 我正在使用Jackson将我的JPA模型序列化到JSON中。 我有以下课程: 和 我正在使用POJO映射从模型序列化到JSON。当我序列化父对象时,我得到以下JSON: 但当我序列化一个子对象时,会得到以下JSON: 缺少对父级的引用。有没有办法解决这个问题?

  • 问题内容: 我对javascript并不太熟悉,而且令人赞叹,因为我无法向使用ORM名称Sequelize.js从数据库中获取的对象添加新属性。 为了避免这种情况,我使用此技巧: 因此,通常如何向对象添加新属性。 如果有帮助,我使用sequelize-postgres版本2.0.x。 更新。 console.log(节点): 接下来,我想您会想到的是:“好吧,很简单,只需将您的属性添加到dataV

  • 问题内容: 我正在尝试创建类实例的JSON字符串表示形式并且遇到困难。假设该类的构建如下: 像这样对json.dumps进行调用: 失败了,并告诉我testclass不可JSON序列化。 我也尝试过使用pickle模块: 它提供类实例信息,但不提供类实例的序列化内容。 我究竟做错了什么? 问题答案: 基本问题是,JSON编码器仅知道默认情况下如何序列化一组有限的对象类型(所有内置类型)。在此处列出