【发布时间】:2020-09-21 23:11:59
【问题描述】:
我想测试一个rest api并检查json请求的所有字段是否都是必需的。 我有设置了所有必填字段的完整 json 请求,我想获取所有缺少 1 个必填字段的请求。
例如,我有这样的要求:
{
"a": "a",
"b": {
"c": [1, 2, 3],
"d": "d"
},
"e": [{"f": 1, "g": 2}]
}
我想测试这些 json 请求,看看是否都按预期失败:
{
"b": {
"c": [1, 2, 3],
"d": "d"
},
"e": [{"f": 1, "g": 2}]
}
{
"a": "a",
"e": [{"f": 1, "g": 2}]
}
{
"a": "a",
"b": {
"d": "d"
},
"e": [{"f": 1, "g": 2}]
}
{
"a": "a",
"b": {
"c": [1, 2, 3]
},
"e": [{"f": 1, "g": 2}]
}
{
"a": "a",
"b": {
"c": [1, 2, 3],
"d": "d"
}
}
{
"a": "a",
"b": {
"c": [1, 2, 3],
"d": "d"
},
"e": [{"g": 2}]
}
{
"a": "a",
"b": {
"c": [1, 2, 3],
"d": "d"
},
"e": [{"f": 1}]
}
json由值、对象和数组递归组成。 我尝试了一些递归方法来返回所有请求,每个请求都缺少 1 个节点,但是我在使用数组时遇到了一些麻烦。 这是我所做的:
public static List<JsonNode> toto(Map.Entry<String, JsonNode> jsonNodeEntry) {
List<JsonNode> list = new ArrayList<>();
JsonNode jsonNode = jsonNodeEntry.getValue();
if(jsonNode.isObject()) {
ObjectNode jsonObject = (ObjectNode) jsonNode;
Iterator<Map.Entry<String, JsonNode>> elements = jsonNode.fields();
while (elements.hasNext()) {
for (JsonNode subJsonNode: toto(elements.next())) {
list.add(jsonObject.deepCopy().set(jsonNodeEntry.getKey(), subJsonNode));
}
ObjectNode jsonObjectCopy = jsonObject.deepCopy();
jsonObjectCopy.remove(jsonNodeEntry.getKey());
list.add(jsonObjectCopy);
}
}
if(jsonNode.isArray()) {
for(JsonNode toto : (ArrayNode)jsonNode) {
Iterator<Map.Entry<String, JsonNode>> subIterator = toto.fields();
while (subIterator.hasNext()) {
for (JsonNode subJsonNode: toto(subIterator.next())) {
//list.add(toto.deepCopy().set(jsonNodeEntry.getKey(), subJsonNode));
}
//list.add(jsonNode.deepCopy().remove(jsonNodeEntry.getKey()));
}
}
}
// list.add(jsonNode.deepCopy().remove(jsonNodeEntry.getKey()));
return list;
}
public static List<String> getJsonRequestsWithOneMandatoryFieldMissing(String jsonStringFromFile) throws IOException {
String jsonString = jsonStringFromFile.replace("#now", ValuesTests.NOW.convert());
List<String> jsonResquestsWithoutOneMandatoryField = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
ObjectNode mandatoryFields = (ObjectNode) mapper.readTree(jsonString);
Iterator<Map.Entry<String, JsonNode>> fieldsIterator = mandatoryFields.fields();
while (fieldsIterator.hasNext()) {
Map.Entry<String, JsonNode> jsonNodeEntry = fieldsIterator.next();
if(jsonNodeEntry.getValue().isObject()) {
ObjectNode jsonObject = (ObjectNode) jsonNodeEntry.getValue();
Iterator<Map.Entry<String, JsonNode>> elements = jsonNodeEntry.getValue().fields();
while (elements.hasNext()) {
for (JsonNode jsonNode: toto(elements.next())) {
jsonResquestsWithoutOneMandatoryField.add(mandatoryFields.deepCopy().set(jsonNodeEntry.getKey(), jsonNode).toPrettyString());
}
ObjectNode mandatoryFieldsCopy = mandatoryFields.deepCopy();
mandatoryFieldsCopy.remove(jsonNodeEntry.getKey());
jsonResquestsWithoutOneMandatoryField.add(mandatoryFieldsCopy.toPrettyString());
}
}
if(jsonNodeEntry.getValue().isArray()) {
for(JsonNode toto : (ArrayNode)(jsonNodeEntry.getValue())) {
Iterator<Map.Entry<String, JsonNode>> subIterator = toto.fields();
while (subIterator.hasNext()) {
for (JsonNode jsonNode: toto(subIterator.next())) {
jsonResquestsWithoutOneMandatoryField.add(mandatoryFields.deepCopy().set(jsonNodeEntry.getKey(), jsonNode).toPrettyString());
}
ObjectNode mandatoryFieldsCopy = mandatoryFields.deepCopy();
mandatoryFieldsCopy.remove(jsonNodeEntry.getKey());
jsonResquestsWithoutOneMandatoryField.add(mandatoryFieldsCopy.toPrettyString());
}
}
}
ObjectNode mandatoryFieldsCopy = mandatoryFields.deepCopy();
mandatoryFieldsCopy.remove(jsonNodeEntry.getKey());
jsonResquestsWithoutOneMandatoryField.add(mandatoryFieldsCopy.toPrettyString());
}
return jsonResquestsWithoutOneMandatoryField;
}
当jsonNode是JsonArray时,我真的不知道如何获取最后一个请求
【问题讨论】:
标签: java json algorithm recursion jackson