【问题标题】:Java parse Json expected double quote issueJava解析Json预期的双引号问题
【发布时间】:2020-11-01 11:49:27
【问题描述】:

我将以下 json 发送到休息端点:

{"test":
    {
       "regisration":{
          "id":"22",
          "birthdate":"1990-06-01T23:00:00.000Z"
       },
       "registrationarray":[
          {
              "id":"22",
              "birthdate":"1990-06-01T23:00:00.000Z"
          }
       ]
    }
 }

我在 Spring Boot 控制器中接收 json 为:

@PostMapping("/register")
public ResponseEntity<?> register(@RequestBody Map<String, Object> data) {
            Map<String,Object> map = new HashMap<String,Object>();
    ObjectMapper mapper2 = new ObjectMapper();

    // mapper2.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

    try {

        map = mapper2.readValue(data.get("registration").toString(),
                new TypeReference<HashMap<String,Object>>(){});
        logger.info("");

当将toString() 应用到data.get("test") 时,我会松开字段名称周围的所有双引号,所以我得到:

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('r' (code 109)): was expecting double-quote to start field name

还有人知道为什么我所有的: 在我的 json 中的字段名之后都更改为=

我的 java 后端项目中有一个类 Registration。我想解析从前端到注册对象的 json 字符串。我应该有mainperson 的注册对象和children 的注册对象数组

【问题讨论】:

  • 因此,toString 的结果在键名周围没有引号,并使用= 而不是:。显然,toString 方法不会创建 JSON。你有什么理由期望它会这样吗?
  • 好吧,我以为它只会返回一个 jsonstring
  • 从这个问题中你的期望是什么?
  • 我的 java 后端项目中有一个类 Registration。我想解析从前端获得的 json 字符串到注册对象。然后我应该有mainperson 的注册对象,children 的注册对象数组
  • 你到底为什么要在那里做你正在做的事情?只需投射地图值:Map&lt;String,Object&gt; map = (Map) data.get("registration");

标签: java json spring-boot jackson


【解决方案1】:

不知道你为什么要这样跳。只需投射地图值:

@PostMapping("/register")
public ResponseEntity<?> register(@RequestBody Map<String, Object> data) {
    Map<String,Object> map = (Map) data.get("registration");
    // code here
}

更好的是,让 Spring/Jackson 将 JSON 映射到结构化数据。

class RegisterRequest {
    private Registration registration;
    // getters and setters
}

class Registration {
    private Person mainperson;
    private List<Person> children;
    // getters and setters
}

class Person {
    private String id;
    private Instant birthdate; // should be LocalDate, but input data has time of day and time zone offsets
    // getters and setters
}
@PostMapping("/register")
public ResponseEntity<?> register(@RequestBody RegisterRequest request) {
    Registration registration = request.geRegistration();
    // code here
}

【讨论】:

  • 我想我写的 json 字符串很不幸。我的顶部字段是test,其中我有一个注册和一个注册数组
【解决方案2】:

您正在尝试将readValueMap.toString() 返回值。方法Map.toString()返回值为{key=value},所以不是JSON,不能用ObjectMapper解析。

【讨论】:

  • 那我应该怎么做呢?
  • 看看安德烈亚斯的回答,使用class而不是Map作为请求体
猜你喜欢
  • 2014-03-27
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多