Как преобразовать LinkedHashMap <String, List <Node>> в JSONObject? - PullRequest
2 голосов
/ 29 апреля 2019

Я новичок в JSONObject и пытаюсь преобразовать LinkedHashMap > в файл json. Карта построена таким образом:

"element_one", {Node1, Node2, etc...}
"element_two", {Node1, Node2, etc...}

Каждый узел имеет два свойства: значение и метку.

Я хочу что-то вроде этого:

{
"element_one": [
{
"items": [
  {
    "value": "1",
    "label": "Donald"
  },
  {
    "value": "2",
    "label": "Goofy"
  }]
}],

"element_two": [
{
"items": [
  {
    "value": "1",
    "label": "Peter"
  },
  {
    "value": "2",
    "label": "Wendy"
  }]
}}

Я использую JSONObject и искал решение в другом потоке, но мне ничего не помогло. Я знаю, что это частный вопрос, но мне нужен этот результат с этой структурой данных.

Сложная задача - зациклить элемент узлов внутри карты без перезаписи элементов, уже вставленных в JSONObject.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 29 апреля 2019

Вы можете использовать stream для преобразования LinkedHashMap в JsonObject:

Node -класс (например):

public class Node {
    private final String value;
    private final String label;

    private Node(String value, String label) {
        this.value = value;
        this.label = label;
    }

    //Getters
}

toItems -методvalue ( List ) => сопоставить узлы со сборщиками и собрать их, используя пользовательский коллектор (Collector.of(...)) для «элементов» JsonObject:

static JsonObject toItems(List<Node> nodes) {
    return nodes
            .stream()
            .map(node ->
                    Json.createObjectBuilder()
                            .add("value", node.getValue())
                            .add("label", node.getLabel())
           ).collect(
                    Collector.of(
                            Json::createArrayBuilder,
                            JsonArrayBuilder::add,
                            JsonArrayBuilder::addAll,
                            jsonArrayBuilder ->
                                    Json.createObjectBuilder()
                                            .add("items", jsonArrayBuilder)
                                            .build()
                    )
            );
}

Stream из Map.Entry<String, List<Node>> преобразовать каждый Entry в JsonObject и собрать все в Root -объект:

 Map<String, List<Node>> nodes = ...
 JsonObject jo = nodes
            .entrySet()
            .stream()
            .map((e) -> Json.createObjectBuilder().add(e.getKey(), toItems(e.getValue()))
            ).collect(
                    Collector.of(
                            Json::createObjectBuilder,
                            JsonObjectBuilder::addAll,
                            JsonObjectBuilder::addAll,
                            JsonObjectBuilder::build
                    )
            );
0 голосов
/ 30 апреля 2019

Я решил это, объединив JSONArray и класс JSONObject.

Я создал основной объект, используя цикл для всех узлов:

for (Node node : nodeList)
{
  try
  {
     JSONObject obj = new JSONObject();
     obj.put("value", node.getValue());
     obj.put("label", node.getLabel());
     jsonArrayOne.put(obj)
  }
  catch (JSONException e)
  {
     log.info("JSONException");
  }
}

Затем поместите jsonArrayOne в jsonObject:

jsonObjOne.put("items", jsonArrayOne);

И поместите этот jsonObjOne в jsonArray:

jsonArrayTwo.put(jsonObjOne);

Поместите это jsonArrayTwo в jsonObject:

jsonObjTwo.put(element, jsonArrayTwo);

Наконец, поместите это jsonObjTwo в jsonArrayFinal.

jsonArrayFinal.put(jsonObjTwo);

В конце я преобразовал jsonArrayFinal в строку:

jsonArrayFinal.toString();
0 голосов
/ 29 апреля 2019

Библиотека GSON поможет вам преобразовать объект в JSON.

Gson gson = new Gson();
String json = gson.toJson(myMap,LinkedHashMap.class);

Зависимость Maven

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
...