我在使用返回JSON字符串的API时遇到了一个问题.try 将JSON字符串响应从API转换为Map<字符串、对象>时,会抛出错误.但是,当我手动将相同的JSON字符串响应嵌入到我的代码中并执行到Map<字符串、对象>的转换时,它可以无缝地工作.事实证明,理解这种行为对我来说是相当具有挑战性的


错误:

上下文初始化期间遇到异常-正在取消刷新try :org.springframework.beans.factory.BeanCreationException:创建名为""TestService""的Bean时出错:调用init方法失败;嵌套异常为Java."异常:com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造java.util.LinkedHashMap的实例(尽管至少存在一个创建器):没有要从字符串值(‘{’)反序列化的字符串参数构造函数/工厂方法" At[来源:(字符串)""{"DXX":{"NX":"XXDHX XXK XIMIXED","XXXX":"X00165401java.util.LinkedHashMap0000087","NXme1":"XINHX","XXhmID":"16401","XXhmNXme":"MXXXEXXXXD WXXXD","INXXXX":"1","XXXNXMe":"XXXIVE","XXXXhgDX":"00000000","XpeXXXXMXX":"XYX","DXXXXXXMX":"00000000","XvXXXXg":"i","XvXXXXXGXMe":"INDIVIDUXX,""XXXDiXXXXg":"N","XXXDiXXXXXDX":"00000000","XXXDiXXXXXX":"00000000000000000000000000000000000000000000000000000000000000000000000000000000000","XXkMXde":"P","DeXqMXde":"P","HighXedeemXmX":"0","HighXedeemPXX":"0","XXXXXXhVXX":"0","XXdPXXEXXND":"200","XXdPXXXXXnuX":"0","XXdPXXXXXnuX":"0","[截断1399个字符];行:1,列:1]


JSON字符串:

{
  "DXX": {
    "NX": "XXDHX XXK XIMIXED",
    "XXXX": "X001654011000000087",
    "NXme1": "XINHX",
    "XXhmId": "16401",
    "XXhmNXme": "MXXXEXXXXD WXXXD",
    "InXXXX": "1",
    "XXXNXme": "XXXIVE",
    "XXXXhgDX": "00000000",
    "XpeXXXXMXinX": "XYX",
    "DXXXXMXinX": "00000000",
    "XvXXXg": "I",
    "XvXXXgNXme": "INDIVIDUXX",
    "XuXXDiXXXXg": "N",
    "XuXXDiXXXXXDX": "00000000",
    "XuXXDiXXXXXX": "0000000000000000000000000",
    "XXkMXde": "P",
    "DeXqMXde": "P",
    "HighXedeemXmX": "0",
    "HighXedeemPXX": "0",
    "XXXXXhVXX": "0",
    "XXdPXXEXXnd": "70610",
    "XXdPXXXXughX": "0",
    "XXdPXXXnuX": "0",
    "XXdPXXXedeemed": "967",
    "XXdPXXXXXed": "0",
    "XXdPXXExpiXed": "0",
    "XXdPXXXdjIn": "10000",
    "XXdPXXXdjXuX": "0",
    "GXXXeXXd": "0",
    "XyXXXDXXXX": "10198",
    "XXdXpndEXXnd": "0",
    "YXdXpendEXXnd": "0",
    "XiXeXXDXXXX": "79643",
    "PXPXXXNXXXXd": "0",
    "XpenXXXedXnXXX": "79643",
    "XXmXMXhXXeq": "1",
    "XXmXDXyXXMXh": "15",
    "XXXXXmXDX": "20231215",
    "NexXXXmXDX": "20240115",
    "DXXpened": "20231204",
    "DiXXPkXPXX": "0",
    "DiXXPkXMXnVXXPXX": "0",
    "XuXXDiXXXXeq": "0",
    "XuXXDiXXDXyXXMXh": "0",
    "XXXXDiXXuXXeDX": "00000000",
    "XuXXDiXXXhXeXhXd": "0",
    "XuXXDiXXMXnVXX": "0",
    "WXiveMemXXee": "N",
    "XXXpnDX": "2023338",
    "XeXXXeXmX": "0",
    "XuXXNXd": "2",
    "PeXIXemNXd": "0",
    "PXXXXXeNXd": "7",
    "XnXXyXd": "IND",
    "XuXXXd": "356",
    "NXXMXhDXXXXXuX": "1",
    "MXnXhXyXXXhXXXkGXXup": [
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "20231215"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      },
      {
        "DiXXXmX": "0",
        "DiXXMXhDX": "00000000"
      }
    ],
    "XXXXXpenXniDXXe": "20241204",
    "XXdDiXXXXXhXXXk": "0",
    "XXdXpendXmX": "0"
  }
}

代码:

        HttpHeaders headers = new HttpHeaders();
        RestTemplate restTemplate = new RestTemplate();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Collections.singletonList(MediaType.ALL));
        headers.add("api_key","qwerqwersadfaf");
        headers.add("x-session-id","asdfasdf");
        headers.add("x-user-id","asdfasdfas");
        headers.add("x-message-id","asdfasdfas");

        String bodyTopost = "{\"Data\": {\"Account\": \"SAMPLEaccount\",\"Schm\": \"168401\"}}";

        HttpEntity<String> entity = new HttpEntity<String>(bodyTopost, headers);
        ParameterizedTypeReference<String> parameterizedTypeReference = new ParameterizedTypeReference<String>() {
        };
        String inputUrl = "https://api.testbank.co.in/cons/abcd/v1";

        try {
            ResponseEntity<String> result = restTemplate.exchange(inputUrl, HttpMethod.POST, entity, parameterizedTypeReference);
            if (result.getStatusCode().is2xxSuccessful()) {
                if (result.getBody() != null) {

                     String resultBody = result.getBody().replace("\\", "");

                    logger.info("Response value is {}", resultBody);

                    ObjectMapper mapper = new ObjectMapper();
                    Map<String, Object> map =  mapper.readValue(resultBody, Map.class);

                    return map;
                } else {
                    logger.info("Payload is null");
                    return null;
                }
            } else {
                logger.info("Failed to execute api");
                return null;
            }
        } catch (ResourceAccessException e) {
            logger.info("Resource Erro  {} ", e);
            return null;
        } catch (RestClientException e) {
            logger.info("Rest Error Erro  {} ", e);
            return null;

        } catch (JsonMappingException e) {
            throw new RuntimeException(e);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }

try 将JSON字符串响应从API转换为Map&lt;字符串、对象&gt;时,会抛出错误.但是,当我手动将相同的JSON字符串响应嵌入到我的代码中并执行到Map&lt;字符串、对象&gt;的转换时,它可以无缝地工作.

字符串数据="{"DXX":{"NX":"XXDHX XXK XIMIXED","XXXX":"X001654011000000087","NXme1":"XINHX","XXhmID":"16401","XXhmNXme":"MXXXEXXD WXXXD","INXXXX":"1","XXXXXNXME":"00000000","XpeXXXXMsinX":"XYX","DXXXXMsinX":"00000000","XvXXXXXg":""i","XvXXXXgNXme":"INDIVIDUXX","XXXXxxxxg:""N","XXXXXXXXXXX:""N,XXXXX""xxxdiXXXXXDX":"00000000","xxxdiXXXXXX":"00000000000000000000000000000000000000000000000000000000000000000","XXkMXde":"P","DeXqMXde":"P","HighXedeemXmX":"0","HighXedeemPXX":"0","XXXXXhVXX":"0","XXXXXhVXX":"0","XXdPXXEXXND":"200","XXdPXXXXughX":"0","XXdPXXXnuX:"0","XXdXXPXXXeSeam:"2","XXdPXXXXXed":"0","XXdPXXExpixXed":"0","XXdPXXXxjin:""10000","XXdPXXXxjin""XXdPXXXdjXxX":"0","GXXXeXXd":"0","XyXXXDXXXX":"10198","XXdXpndEXXnd":"0","XXdPXXEXXnd":"70610","XXdPXXXXughX":"0","XXdPXXXnuX":"0","XXdPXXXnuX":"0","XXdPXXXXXed":"0","XXdPXXExpiXed":"0","XXdPXXXdjIn":"10000","XXdPXXXdjX":"0","YXxxxPxxnd":"0","GXXXxed":"0,""xiXeXXDXXXX":"79643","PXPXXXNXXXXd":"0","XpenXXXedXnXXX":"79643","XXmXMXhXXeq":"1","XXmXDXyXXMXh":"15","XXXXmXDX":"20231215","NexXXXmXDX":"20240115","DXXpen":"20231204","DiXXPkxxxPXX":"0","DiXXPkXMXnVXXPXX":"0","xXXXXDiXXXXDXyXXMXh":"0","XXXXXXDixxxxeDX":"00000000","xxXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxx,xxxxxxxxxx:",xxxxxxxxxx,xxxxxxxx,xxxxxxxxx,xxxxxxx"徐XXDiXXMXnVXX":"0","WxiveMemXXee":"N","XXXpnDX":"2023338","XeXXXeXmX":"0","徐XXNXd":"2","PeXIXemNXd":"0","PXXXXXeNXd":"7","XnXXyXd":"IND","徐XXXd":"356","NXXMXhDXXXXXX":"1","MXnXXhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:[{""DiXXxxmx":"0",""DiXXMXhdx"":"20231215","""DiXXMXhDX":"00000000"},{"DiXXXmX":"0","DiXXMXhDX":"00000000"},{"DiXXXmX":"0","DiXXMXhDX":"00000000"},{"DiXXXmX":"0","DiXXMXhDX":"00000000"}],"XXXXXpenXniDXXe":"20241204","XXdDiXXXXXhXXXk":"0","XXdXPendXmX":"0"}";

对象映射器映射器=新对象映射器(); Map&lt;字符串,对象&gt;map=mapper.readValue(data,Map.class);

当我直接将API的响应转换为Map String,Object时,>

推荐答案

它认为从API返回的字符串有两个额外的引号,一个是BEGIN,另一个在字符串的末尾,查看堆栈跟踪的SOURCE属性:[Source: (String)""{"DXX":{"NX":"XXDHX XXK ...

解决此问题的一种方法是在读取值之前删除多余的引号,如下所示:

int begin = resultBody.indexOf("{");
int end = resultBody.lastIndexOf("}") + 1;
resultBody= resultBody.substring(begin, end);

用于重现此错误的代码:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;

public class Main {

  public static void main(String[] args) throws JsonProcessingException {

    String resultBody="\"{\"DXX\":{\"NX\":\"XXDHX XXK XIMIXED\",\"XXXX\":\"X001654011000000087\",\"NXme1\":\"XINHX\",\"XXhmId\":\"16401\",\"XXhmNXme\":\"MXXXEXXXXD WXXXD\",\"InXXXX\":\"1\",\"XXXNXme\":\"XXXIVE\",\"XXXXhgDX\":\"00000000\",\"XpeXXXXMXinX\":\"XYX\",\"DXXXXMXinX\":\"00000000\",\"XvXXXg\":\"I\",\"XvXXXgNXme\":\"INDIVIDUXX\",\"XuXXDiXXXXg\":\"N\",\"XuXXDiXXXXXDX\":\"00000000\",\"XuXXDiXXXXXX\":\"0000000000000000000000000\",\"XXkMXde\":\"P\",\"DeXqMXde\":\"P\",\"HighXedeemXmX\":\"0\",\"HighXedeemPXX\":\"0\",\"XXXXXhVXX\":\"0\",\"XXdPXXEXXnd\":\"200\",\"XXdPXXXXughX\":\"0\",\"XXdPXXXnuX\":\"0\",\"XXdPXXXedeemed\":\"2\",\"XXdPXXXXXed\":\"0\",\"XXdPXXExpiXed\":\"0\",\"XXdPXXXdjIn\":\"10000\",\"XXdPXXXdjXuX\":\"0\",\"GXXXeXXd\":\"0\",\"XyXXXDXXXX\":\"10198\",\"XXdXpndEXXnd\":\"0\",\"XXdPXXEXXnd\":\"70610\",\"XXdPXXXXughX\":\"0\",\"XXdPXXXnuX\":\"0\",\"XXdPXXXedeemed\":\"967\",\"XXdPXXXXXed\":\"0\",\"XXdPXXExpiXed\":\"0\",\"XXdPXXXdjIn\":\"10000\",\"XXdPXXXdjXuX\":\"0\",\"YXdXpendEXXnd\":\"0\",\"GXXXeXXd\":\"0\",\"XiXeXXDXXXX\":\"79643\",\"PXPXXXNXXXXd\":\"0\",\"XpenXXXedXnXXX\":\"79643\",\"XXmXMXhXXeq\":\"1\",\"XXmXDXyXXMXh\":\"15\",\"XXXXXmXDX\":\"20231215\",\"NexXXXmXDX\":\"20240115\",\"DXXpened\":\"20231204\",\"DiXXPkXPXX\":\"0\",\"DiXXPkXMXnVXXPXX\":\"0\",\"XuXXDiXXXXeq\":\"0\",\"XuXXDiXXDXyXXMXh\":\"0\",\"XXXXDiXXuXXeDX\":\"00000000\",\"XuXXDiXXXhXeXhXd\":\"0\",\"XuXXDiXXMXnVXX\":\"0\",\"WXiveMemXXee\":\"N\",\"XXXpnDX\":\"2023338\",\"XeXXXeXmX\":\"0\",\"XuXXNXd\":\"2\",\"PeXIXemNXd\":\"0\",\"PXXXXXeNXd\":\"7\",\"XnXXyXd\":\"IND\",\"XuXXXd\":\"356\",\"NXXMXhDXXXXXuX\":\"1\",\"MXnXhXyXXXhXXXkGXXup\":[{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"20231215\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"},{\"DiXXXmX\":\"0\",\"DiXXMXhDX\":\"00000000\"}],\"XXXXXpenXniDXXe\":\"20241204\",\"XXdDiXXXXXhXXXk\":\"0\",\"XXdXpendXmX\":\"0\"}}\"";
//    int begin = resultBody.indexOf("{");
//    int end = resultBody.lastIndexOf("}") + 1;
//    resultBody= resultBody.substring(begin, end);
    Map<String, Object> map = new ObjectMapper().readValue(resultBody, Map.class);
    System.out.println(map.entrySet());
  }
}

Java相关问答推荐

表格栏上的事件过滤器在PFA中不起作用

ittext pdf延迟签名,签名无效

Android Studio—java—在onBindViewHolder中,将断点和空白添加到BackclerView中

将不受支持的时区UT重写为UTC是否节省?

在bash中将数组作为Java程序的参数传递

为什么在maven中,getLast方法不适用于List?

如何获取Instant#of EpochSecond(?)的最大值

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

如何在一行中使用Dijkstra中的Java Stream

如何在我的世界中为互动增加冷却时间?

我的代码是线程安全的吗?[Java、CAS、转账]

如何通过Java java.lang.Foreign API访问本机字节数组

我该如何为我的类编写getter和setter方法?

如何在Java中的重写方法参数中强制(Enum)接口实现?

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

如何通过gradle命令行从build.gradle获得Java targetCompatibility

放置在变量中的Java成员引用不相等

带有提取器的JavaFXObservableList会根据侦听器的存在而改变行为

有没有办法仅将 JComboBox 中的选定项目居中(因此保持组合框中的所有项目左对齐)