如何转义作为对象加载的 json 的一部分

how to escape part of json loaded as object

我不擅长 API 测试因此我的问题。我有一个 POST(模拟)的主体,其中包括:

{
 "request":
 {
 "urlPath": "path/to/",
 "method": "POST",
 "bodyPatterns":[{
            "equalToJson" : "{\n\"query\": [\n{\n\"name\": \"name1\",\n\"value\": \"123\"\n        },\n{\n\"name\": \"name2\",\n\"value\": \"345\"\n},\n{\n\"name\": \"name3\",\n\"value\": \"someName\"\n}\n],\n\"anotherItem\": [],\n\"side\": 77,\n\"pageSize\": 44\n}", "jsonCompareMode": "LENIENT"
}]
 },
 "response":
 {
 "status": 200,
 "headers":
 {
 "Content-Type" : "application/json"
 },
 "body":  "{"items\": [\n{\n\"item\": 1,\n    
              \"item2\": 2,\n
              etc
"\n}\n]\n}"
 }
} 

我想使用一些 pojo 类 来单独创建请求和响应:

public Request initRequest() {
        BodyPattern bodyPat = new BodyPattern();
        Query query = new Query();
        Query query2 = new Query();
        Query query3 = new Query();
        EqualToJson equalToJ = new EqualToJson();
        query.setName("name1");
        query.setValue("123");
        query2.setName("name2");
        query2.setValue("345");
        query3.setName("name2");
        query3.setValue("someName");
        List<Query> queryList = new ArrayList<>();
        queryList.add(query);
        queryList.add(query2);
        queryList.add(query3);
        equalToJ.setQuery(queryList);
        List<Filter> filtersList = new ArrayList<>();
        equalToJ.setFilter(filtersList);
        equalToJ.setSide(77);
        equalToJ.setPageSize(44);
        List<EqualToJson> eqList = new ArrayList<>();
        eqList.add(equalToJ);

        req.setUrlPath(URL + "/Test001"); 
        req.setMethod("POST");

        bodyPat.setEqualToJson(eqList);
        bodyPat.setJsonCompareMode("LENIENT");
        List<BodyPattern> bodyPatList = new ArrayList<>();
        bodyPatList.add(bodyPat);

        req.setBodyPatterns(bodyPatList);
        return req;
}

要以更加用户友好的视图查看它,请执行以下操作:

{
  "request": {
    "urlPath": "/path/to",
    "method": "POST",
    "bodyPatterns": [
      {
        "equalToJson": {
          "query": [
            {
              "name": "name1",
              "value": "123"
            },
            {
              "name": "name2",
              "value": "345"
            },
            {
              "name": "name3",
              "value": "someName"
            }
          ],
          "filter": [
          ],
          "side": 77,
          "pageSize": 44
        },
        "jsonCompareMode": "LENIENT"
      }
    ]
  },
  "response": {
    "status": 200,
    "headers": {
      "Content-Type": "application/json"
    },
    "body": {
      "side": 77,
      "pageSize": 44,
      "items": [
        {
          "name1": "123",
          "name2": "345",
          "name3": "someName"
    etc...

        }
      ]
    }
  }
}

同样,我使用 Response。 我的问题是,我怎样才能让 json (BodyPatters) 的一部分作为转义标志? Mock 是这样创建的,它只接受 json 这部分的转义字符。 我当然可以硬编码此有效负载,但我想控制这些字段的值并将它们作为参数来引导。 我真的不知道该如何处理。

可以使用jackson的objectmapper将Object转成String。例如:

void name2() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();

    Query query = new Query("name1", "123");

    EqualToJson equalToJson = new EqualToJson();
    equalToJson.setQuery(Arrays.asList(query));

    BodyPattern bodyPattern = new BodyPattern();
    bodyPattern.setEqualToJson(mapper.writeValueAsString(equalToJson));

    String bodyPatternText = mapper.writerWithDefaultPrettyPrinter()
            .writeValueAsString(bodyPattern);
    System.out.println(bodyPatternText);
}

@Data
@AllArgsConstructor
static class Query{
    private String name;
    private String value;
}

@Data
static class EqualToJson {
    private List<Query> query;
}

@Data
static class BodyPattern  {
    private String equalToJson;
}

这是一个结果:

{
  "equalToJson" : "{\"query\":[{\"name\":\"name1\",\"value\":\"123\"}]}"
}