Обход динамических c JSON для чтения свойств каждого дочернего узла - PullRequest
0 голосов
/ 27 мая 2020

У меня есть несколько JSON, которые могут быть изменены, но одна константа - всегда будет содержать несколько объектов с двумя свойствами; text и answerText. Например, JSON будет

{
    "food": {
        "eggTolerance": {
            "answerText": "None",
            "text": "What is your egg tolerance?"
        },
        "lactoseTolerance": null
    },
    "cookingExperience": {
        "experienceInLastFiveYears": {
            "answerText": "Yes",
            "text": "Was this experience within the last 5 years?"
        },
        "numberOfPies": {
            "answerText": "More than 50",
            "text": "How many pies have you baked?"
        },
        "significantPies": {
            "answerText": "More than 50",
            "text": "How many of these pies per quarter were at tasty?"
        },
        "spanOfExperience": {
            "answerText": "Yes",
            "text": "Do you have at least 12 months' experience baking pies?"
        }
    },
    "cocktails": {
        "manhattans": {
            "answerText": "The kiss of death",
            "text": "What have I done to deserve this flat, flavourless Manhattan?"
        },
        "Gin Martini": null
    },
    "waitressing": null
}

Это можно изменить, сделав его глубже или шире. Например, к lactoseTolerance может быть добавлен другой объект, или другой объект может быть добавлен к root объекту.

Как я могу пройти этот объект, чтобы посетить каждый объект, чтобы получить свойства самого глубокого объекта ?

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

1 Ответ

0 голосов
/ 27 мая 2020

Я использовал GSON lib: Пожалуйста, попробуйте следующий код:

pom.xml

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

Затем я создал класс QA с вашими фиксированными двумя свойствами; текст и ответ Текст

import com.google.gson.annotations.SerializedName;

public class QA {
    @SerializedName("answerText")
    private String answerText;
    @SerializedName("text")
    private String text;

    public QA(String answerText, String text) {
        this.answerText = answerText;
        this.text = text;
    }

    @Override
    public String toString() {
        return "QA{" +
                "answerText='" + answerText + '\'' +
                ", text='" + text + '\'' +
                '}';
    }


    public String getAnswerText() {
        return answerText;
    }

    public void setAnswerText(String answerText) {
        this.answerText = answerText;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }


}

Теперь в коде драйвера:

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        System.out.println("running!!");
        InputStream inputStream = Main.class.getResourceAsStream("json.json");
        String json = "{\n" +
                "  \"food\": {\n" +
                "    \"eggTolerance\": {\n" +
                "      \"answerText\": \"None\",\n" +
                "      \"text\": \"What is your egg tolerance?\"\n" +
                "    },\n" +
                "    \"lactoseTolerance\": null\n" +
                "  },\n" +
                "  \"cookingExperience\": {\n" +
                "    \"experienceInLastFiveYears\": {\n" +
                "      \"answerText\": \"Yes\",\n" +
                "      \"text\": \"Was this experience within the last 5 years?\"\n" +
                "    },\n" +
                "    \"numberOfPies\": {\n" +
                "      \"answerText\": \"More than 50\",\n" +
                "      \"text\": \"How many pies have you baked?\"\n" +
                "    },\n" +
                "    \"significantPies\": {\n" +
                "      \"answerText\": \"More than 50\",\n" +
                "      \"text\": \"How many of these pies per quarter were at tasty?\"\n" +
                "    },\n" +
                "    \"spanOfExperience\": {\n" +
                "      \"answerText\": \"Yes\",\n" +
                "      \"text\": \"Do you have at least 12 months' experience baking pies?\"\n" +
                "    }\n" +
                "  },\n" +
                "  \"cocktails\": {\n" +
                "    \"manhattans\": {\n" +
                "      \"answerText\": \"The kiss of death\",\n" +
                "      \"text\": \"What have I done to deserve this flat, flavourless Manhattan?\"\n" +
                "    },\n" +
                "    \"Gin Martini\": null\n" +
                "  },\n" +
                "  \"waitressing\": null\n" +
                "}";

                final Gson gson = new Gson();


                Type type = new TypeToken<Map<String, Map<String, QA>>>(){}.getType();
                Map<String, Map<String, QA>> myMap = gson.fromJson(json, type);
                System.out.println("Data:"+ myMap.get("food").get("eggTolerance").getAnswerText());


    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...