Создайте новую строку json, используя файл шаблона json и файл данных json - PullRequest
0 голосов
/ 16 мая 2019

У меня есть файл шаблона json, как показано ниже

{
  "value": "abc",
  "Treatments": [{
    "value": "def",
    "Stages": [{
      "value": "ghi"
    }]
  }]
}

И данные json

{ "abc": {
    "labelabc": "Assembly name abc",
    "typeabc": "STRING_TYPE abc",
    "formatabc": "N abc"
  },
  "def": {
    "labeldef": "Assembly name def",
    "typedef": "STRING_TYPE def",
    "formatdef": "N def"
  },
  "ghi": {
    "labelghi": "Assembly name ghi",
    "typeghi": "STRING_TYPE ghi",
    "formatghi": "N ghi"
  }
}

Я ищу решение для анализа шаблона в

{
  "labelabc": "Assembly name abc",
  "typeabc": "STRING_TYPE abc",
  "formatabc": "N abc",
  "Treatments": [
    {
      "labeldef": "Assembly name def",
      "typedef": "STRING_TYPE def",
      "formatdef": "N def",
      "Stages": [
        {
          "labelghi": "Assembly name ghi",
          "typeghi": "STRING_TYPE ghi",
          "formatghi": "N ghi"
        }
      ]
    }
  ]
}

Имеется в виду:

  • Заменить запись "value" значением jsonobject в файле данных json

Я уже использовал приведенный ниже код для достижения результата с 2 уровнямишаблон.Но не удалось с выше 3 уровня шаблона

public static JsonElement generateTemplate(JsonElement templateJson, JsonElement dataTemplate) {
if (templateJson.isJsonArray()) {
            for (JsonElement jsonElement1 : templateJson.getAsJsonArray()) {
                generateTemplate(jsonElement1, dataTemplate);
            }
        } else if (templateJson.isJsonObject()) {
            for (Iterator<Map.Entry<String, JsonElement>> iterator = templateJson.getAsJsonObject().entrySet()
                    .iterator(); iterator.hasNext();) {
                Map.Entry<String, JsonElement> entry = iterator.next();
                if (entry.getKey().equals("value")) {
                    templateJson = dataTemplate.getAsJsonObject().get(entry.getValue().getAsString()).getAsJsonObject();
                } else {
                    if (entry.getValue().isJsonObject()) {
                        generateTemplate(entry.getValue(), dataTemplate);
                    } else
                        templateJson.getAsJsonObject().add(entry.getKey(), p.parse(
                            dataTemplate.getAsJsonObject().get(entry.getValue().getAsString()).getAsJsonObject()
                                ));
                }

                generateTemplate(entry.getValue(), dataTemplate);
            }
        }

return templateJson;
}

Очень ценю ваши советы

1 Ответ

1 голос
/ 17 мая 2019

Вы можете использовать рекурсию. Это основная идея, вы можете отрегулировать фактические замены в соответствии с вашими потребностями позже в методе modifyObject, который для "value": "abc" будет ожидать, что объект будет храниться в data в

"abc": {
    "labelabc": "Assembly name abc",
    "typeabc": "STRING_TYPE abc",
    "formatabc": "N abc"
}
private static void modifyObject(JsonObject obj, JsonObject replacement) {
    obj.remove("value");
    for (String key : replacement.keySet()) {
        obj.addProperty(key, replacement.get(key).getAsString());
    }
}

public static JsonElement traverse(JsonElement element, JsonObject allReplacements) {
    if (element.isJsonObject()) {
        JsonObject asJsonObject = element.getAsJsonObject();
        ///keys can change after we modify object,
        //but we want to iterate only over original keys
        Set<String> originalKeys = new HashSet<>(asJsonObject.keySet());
        for (String key : originalKeys) {
            if (key.equals("value")) {
                String value = asJsonObject.get(key).getAsString();
                modifyObject(asJsonObject, allReplacements.getAsJsonObject(value));
            } else {
                traverse(asJsonObject.get(key), allReplacements);
            }
        }
    } else if (element.isJsonArray()) {
        for (JsonElement innerElement : element.getAsJsonArray()) {
            traverse(innerElement, allReplacements);
        }
    }
    return element;
}

Использование:

public static void main(String[] args) throws Exception {
    String jsonTemplate =
            "{\n" +
            "  \"value\": \"abc\",\n" +
            "  \"foo\": \"bar\",\n" +
            "  \"Treatments\": [ {\n" +
            "    \"value\": \"def\",\n" +
            "    \"Stages\": [ [ {\n" +
            "      \"value\": \"ghi\"\n" +
            "    } ] ]\n" +
            "  } ]\n" +
            "}";
    String jsonData = "{ \"abc\": {\n" +
            "    \"label\": \"Assembly name abc\",\n" +
            "    \"type\": \"STRING_TYPE abc\",\n" +
            "    \"format\": \"N\"\n" +
            "  },\n" +
            "  \"def\": {\n" +
            "    \"label\": \"Assembly name def\",\n" +
            "    \"type\": \"STRING_TYPE\",\n" +
            "    \"format\": \"N\"\n" +
            "  },\n" +
            "  \"ghi\": {\n" +
            "    \"label\": \"Assembly name ghi\",\n" +
            "    \"type\": \"STRING_TYPE\",\n" +
            "    \"format\": \"N\"\n" +
            "  }\n" +
            "}";


    JsonParser jsonParser = new JsonParser();
    JsonElement template = jsonParser.parse(jsonTemplate);
    JsonObject data = (JsonObject) jsonParser.parse(jsonData);

    JsonElement obj = template.deepCopy();//in case we don't want to modify original template

    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    System.out.println(gson.toJson(traverse(obj, data)));

}

Выход:

{
  "foo": "bar",
  "Treatments": [
    {
      "Stages": [
        [
          {
            "label": "Assembly name ghi",
            "type": "STRING_TYPE",
            "format": "N"
          }
        ]
      ],
      "label": "Assembly name def",
      "type": "STRING_TYPE",
      "format": "N"
    }
  ],
  "label": "Assembly name abc",
  "type": "STRING_TYPE abc",
  "format": "N"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...