当前位置: 首页 > 知识库问答 >
问题:

ObjectMapper不接受来自HttpURLConnection的JSON响应

管峻
2023-03-14

在读取我从缓冲读取器构建的 JSON 字符串并尝试将值分配给 POJO 类时遇到问题。

当我使用此格式时,它可以工作(意外发现,复制粘贴):

字符串build={\"特性\":{\"id\":\"888888\",\"name\":\"A9刷新版本\"}

但实际上从BufferedReader中读取时,它看起来像下面一个:-

{“功能”:{“id”:“888888”,“名称”:“A9刷新版本”}}

这是我的代码:

    BufferedReader in = new BufferedReader(newInputStreamReader(connection.getInputStream()));
    StringBuilder build = new StringBuilder();
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
         build.append(inputLine); }
    in.close();
ObjectMapper mapper = new ObjectMapper();
Feature wrap = mapper.readValue(build, Feature.class);

我的问题不是我不知道如何将JSON字符串编组到POJO,而是我从HttpURLConnection获得的JSON响应对于ObjectMapper无效。

共有2个答案

公良云
2023-03-14

我发现了我的问题。对象映射器.read值(刺痛一个,瓦耶类型)作为状态只接受字符串。我正在发送一个字符串生成器字符串生成器不会格式化我的 JSON,但字符串会。简单修复

Feature wrap = mapper.readValue(build.toString(), Feature.class);
包阳成
2023-03-14

实际上,您必须首先将 JSON 字符串解析为杰克逊 JsonNode。

public <T> T readValue(JsonParser jp,
              Class<T> valueType)
            throws IOException,
                   JsonParseException,
                   JsonMappingException

将JSON内容反序列化为非容器类型(但是,它可以是数组类型)的方法:通常是bean、数组或包装器类型(如布尔值)。

注意:如果结果类型是容器(集合或映射),则不应使用此方法。原因是由于类型擦除,在使用该方法时,键和值类型不能被内省。

最终,有2个解决方案可以解决您的问题,如下所示:-

1.快速解析:-

BufferedReader in = new BufferedReader(newInputStreamReader(connection.getInputStream()));
    StringBuilder build = new StringBuilder();
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
         build.append(inputLine); }
         in.close();
    ObjectMapper mapper = new ObjectMapper();
    Feature wrap = mapper.readValue(mapper.readTree(build), Feature.class);

2.低级解析:-

BufferedReader in = new BufferedReader(newInputStreamReader(connection.getInputStream()));
    StringBuilder build = new StringBuilder();
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
         build.append(inputLine); }
         in.close();
    ObjectMapper mapper = new ObjectMapper();
    JsonFactory factory = mapper.getFactory();
    JsonParser parser = factory.createParser(build);
    Feature wrap = mapper.readValue(mapper.readTree(parser), Feature.class);
 类似资料:
  • 问题内容: 我正在尝试使用Spring 3.0.6返回JSON响应,但是得到了406响应“ Not Acceptable”,其描述为:“此请求所标识的资源仅能够生成具有以下特征的响应:请求“接受”标头()。” 我知道之前曾问过一个非常类似的问题,但尽管进行了许多测试,但我无法使它适用于我的项目,而且我不知道自己在做什么错。 在我的Maven pom.xml中,执行以下操作: 在web.xml中,我

  • 我们在针对带IDP的SAML SSO的Java应用程序中使用了(v1.0.3)。 null null

  • 问题内容: 我已经在机架空间上启动了CentOS服务器并执行了‘d。然后。因此,只是准系统。 我可以通过ssh(22)远程访问其IP地址,所以DNS或其他任何问题(我认为…)都没有问题,但是当我尝试通过浏览器等通过端口80进行连接时,拒绝连接。 但是,从本地主机,我可以使用telnet(80),甚至可以使用lynx并毫无问题地得到服务。telnet从外部(我的房子,我的学校,当地的咖啡店等)在22

  • 我在外设模式下使用Nexus 9。我创建了一个GATT服务器实例: 我创建了一个BluetoothGattService BluetoothGattServerCallBack的实例: 现在,当我尝试将GATT客户端连接到此服务器时,BluetoothGattServerCallback的onConnectionStateChange()方法从未被调用。 来自客户端应用程序的代码: 连接到运行在N

  • 问题内容: 我有一个简单的HTTP Server站在Golang中: 在调用方不是localhost的地方断开连接的最佳方法是什么?目前,我正在考虑检查底层的连接信息,并确保IP地址为,但这在最终删除连接之前浪费了大量资源(并运行了大量Go代码)。理想情况下,我可以检测Golang服务器以基于IP地址丢弃初始TCP SYN数据包,而根本不创建TCP连接(或显示该端口正在侦听)。 前进的最干净的道路

  • 我的应用程序中使用了Google的oauth2,其中id_token是由句点分隔的字符串。我在这里读到,id_token被划分为三部分,第二部分包含实际有效负载。如果我将字符串拆分并解码第二个值,我将使用我的帐户得到我期望的结果。但我不明白的是,当我尝试使用我妻子的帐户时,如果我将第二部分解析为json,就会出现“意外字符”错误。 我尝试过从控制台获取字符串并通过在线Base64解码器运行它,但确