无法从start_array令牌中反序列化

问题描述

这是我的POST测试方法

public void createParagraph3() {
    RestAssured.baseURI = paragraphsURL;
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("featurePackage",Arrays.asList(new HashMap<String,String>() {{
            put("name","Test");
            put("inputText","test test");
    }}));
    map.put("features",Object>() {{
            put("featureType","Feature");
            put("inUse","true");
            put("name","test xyxy");
    }}));
    map.put("type",String>() {{
        put("key","int");
        put("name","Introduction");
    }}));
    RequestSpecification request = RestAssured.given();
    request.header("Content-Type","application/json");
    request.body(map).toString();
    Response response = request.post();
    int statusCode = response.getStatusCode();
    System.out.println("Response body: " + response.body().asstring());
    System.out.println("Status code received: " + statusCode);
}

以下是我在创建测试的基础上的要求

{
  "featurePackage": {
    "features": [
      {
        "featureType": "string","id": 0,"inUse": true,"name": "string"
      }
    ],"name": "string","objectCount": 0
  },"features": [
    {
      "featureType": "string","name": "string"
    }
  ],"inputText": "string","objectCount": 0,"outputHtmlText": "string","sourceFileName": "string","type": {
    "key": "string","name": "string"
  }
}

我做错了什么?我仍然收到400响应“无法反序列化实例”。有人可以帮忙吗?我的方法请求不完整?

解决方法

编辑1:

根本原因是map.toString()不是有效的JSON字符串。

有两种方法可以解决此问题:

  1. 使用JSONObject代替地图,请参见this
  2. 将地图转换为JSON对象,请参见this

PS:有关map.toString()

的演示
Map<String,Integer> map = new HashMap<>();
map.put("apple",1);
map.put("banana",2);


System.out.println(map.toString());
// get: {apple=1,banana=2} is NOT a valid JSON String
// but,{"apple":1,"banana":2} is a valid JSON String

编辑2:

由于问题的所有者添加了一些评论,因此我必须添加以下答案。

Pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.10.0</version>
</dependency>

Java代码:

// your comment
Map<String,Object> titles = new HashMap<>();
titles.put("titles",Arrays.asList(new HashMap<String,Object>() {
    {
        put("id","876");
        put("title","test");
    }
}));
System.out.println(titles);

// my new answer
import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(titles);
System.out.println(json);