首页 > 解决方案 > 无法反序列化 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", Arrays.asList(new HashMap<String, Object>() {{
            put("featureType", "Feature");
            put("inUse", "true");
            put("name", "test xyxy");
    }}));
    map.put("type", Arrays.asList(new HashMap<String, 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"
      }
    ],
    "id": 0,
    "name": "string",
    "objectCount": 0
  },
  "features": [
    {
      "featureType": "string",
      "id": 0,
      "inUse": true,
      "name": "string"
    }
  ],
  "id": 0,
  "inputText": "string",
  "objectCount": 0,
  "outputHtmlText": "string",
  "sourceFileName": "string",
  "type": {
    "key": "string",
    "name": "string"
  }
}

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

标签: arraysjsonrest-assuredweb-api-testingrest-assured-jsonpath

解决方案


编辑1:

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

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

  1. 使用 JSONObject 而不是 map,看这个
  2. 将地图转换为 JSON 对象,请参阅

PS:一个关于的demomap.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);

推荐阅读