【问题标题】:Remove 1 field from json从 json 中删除 1 个字段
【发布时间】: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


    【解决方案1】:

    我终于做到了:

        public static List<JsonNode> recursiveJsonParser(JsonNode jsonNode) {
            List<JsonNode> listToReturn = new ArrayList<>();
            if(jsonNode.isValueNode()) {
            }
            if(jsonNode.isObject()) {
                ObjectNode objectNode = (ObjectNode) jsonNode;
                Iterator<Map.Entry<String, JsonNode>> fields = objectNode.fields();
                while (fields.hasNext()) {
                    Map.Entry<String, JsonNode> current = fields.next();
                    List<JsonNode> subList = recursiveJsonParser(current.getValue());
                    for (JsonNode subJsonNode: subList) {
                        ObjectNode objectNodeCopy = objectNode.deepCopy();
                        objectNodeCopy.set(current.getKey(), subJsonNode);
                        listToReturn.add(objectNodeCopy);
                    }
                }
            }
            if(jsonNode.isArray()) {
                ArrayNode arrayNode = (ArrayNode) jsonNode;
                Iterator<JsonNode> elements = arrayNode.elements();
                while (elements.hasNext()) {
                    int index = 0;
                    List<JsonNode> subList = recursiveJsonParser(elements.next());
                    for (JsonNode subJsonNode: subList) {
                        ArrayNode arrayNodeCopy = arrayNode.deepCopy();
                        arrayNodeCopy.set(index, subJsonNode);
                        listToReturn.add(arrayNodeCopy);
                    }
                    index ++;
                }
            }
            listToReturn.add(NullNode.getInstance());
            return listToReturn;
        }
    

    越简单越好!

    【讨论】:

      猜你喜欢
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多