Преобразование объекта Json в hashmap? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть строковый объект, представляющий объект json, возвращаемый для сетевой задачи. Мне нужно преобразовать его в карту (или HashMap). Я использую GSON, но это не удалось. Вот строка json (прошу прощения за отступ, потому что мне пришлось вручную добавлять пробелы):

{
"plans":{
"Ankle Recovery":{
"StartDate":"09/24/2018",
"Progress":0.6666666666666666,
"Tasks":[
        {
            "date":"10/16/2018",
            "amount":200,
            "task":"ice ankle for 30 min",
            "completed":true,
            "requirementType":"steps"},
            {
                "date":"10/17/2018",
                "amount":200,
                "task":"ice ankle for 30 min",
                "completed":true,
                "requirementType":"steps"
            },
            {
                "date":"10/18/2018",
                "amount":200,
                "task":"ice ankle for 30 min",
                "completed":false,
                "requirementType":"steps"
            }
],
"Username":"email@site.com",
"Doctor":"Mike Michaels",
"EndDate":"12/24/2018"}},
"status":true
}

Это код, который я использовал для преобразования:

private Map<String, String> plans;
plans = new Gson().fromJson(result, new TypeToken<Map<String, String>>() {}.getType());

Ни, ни работал. Я перепробовал несколько различных решений для переполнения стека, но ни одно из них не принесло успеха.

Мне также выдается исключение, которое я не совсем понимаю:

 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 11

(столбец 11 перед первой цитатой в «AnkleRecovery»)

Я бы хотел использовать простой gson, чтобы сделать эту работу, если это возможно. Но я открыт для альтернативных решений.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Отказ от ответственности ...

Я бы всегда исследовал использование одного или нескольких POJO, которые можно использовать для представления структуры данных, если это вообще возможно.

Без дополнительной информации невозможно узнать, стабильны ли такие ключи, как Ankle Recovery, или они могут измениться.

«А» возможное решение

Как правило, JSON представлен в форме пар ключ / значение, где значением может быть другой объект JSON, массив или список других значений, так что вы можете "напрямую" обработать структуру, например ...

String text = "{\n"
        + "  \"plans\":{\n"
        + "    \"Ankle Recovery\":{\n"
        + "      \"StartDate\":\"09/24/2018\",\n"
        + "      \"Progress\":0.6666666666666666,\n"
        + "      \"Tasks\":[\n"
        + "        {\n"
        + "          \"date\":\"10/16/2018\",\n"
        + "          \"amount\":200,\n"
        + "          \"task\":\"ice ankle for 30 min\",\n"
        + "          \"completed\":true,\n"
        + "          \"requirementType\":\"steps\"\n"
        + "        },\n"
        + "        {\n"
        + "          \"date\":\"10/17/2018\",\n"
        + "          \"amount\":200,\n"
        + "          \"task\":\"ice ankle for 30 min\",\n"
        + "          \"completed\":true,\n"
        + "          \"requirementType\":\"steps\"\n"
        + "        },\n"
        + "        {\n"
        + "          \"date\":\"10/18/2018\",\n"
        + "          \"amount\":200,\n"
        + "          \"task\":\"ice ankle for 30 min\",\n"
        + "          \"completed\":false,\n"
        + "          \"requirementType\":\"steps\"\n"
        + "        }\n"
        + "      ],\n"
        + "      \"Username\":\"email@site.com\",\n"
        + "      \"Doctor\":\"Mike Michaels\",\n"
        + "      \"EndDate\":\"12/24/2018\"\n"
        + "    }\n"
        + "  },\n"
        + "  \"status\":true\n"
        + "}";

Gson gson = new Gson();
Map<String, Object> fromJson = gson.fromJson(text, Map.class);
Map<String, Object> plans = (Map<String, Object>) fromJson.get("plans");
Map<String, Object> recovery = (Map<String, Object>) plans.get("Ankle Recovery");
List<Map<String, Object>> tasks = (List<Map<String, Object>>) recovery.get("Tasks");
for (Map<String, Object> taks : tasks) {
    for (Map.Entry<String, Object> entry : taks.entrySet()) {
        System.out.println(entry.getKey() + " = " + entry.getValue());
    }
}

Теперь это даст вам вывод ...

date = 10/16/2018
amount = 200.0
task = ice ankle for 30 min
completed = true
requirementType = steps
date = 10/17/2018
amount = 200.0
task = ice ankle for 30 min
completed = true
requirementType = steps
date = 10/18/2018
amount = 200.0
task = ice ankle for 30 min
completed = false
requirementType = steps

Сказав все это, ваш собственный синтаксический анализ может быть гораздо более сложным, необходимо проверить, существуют ли определенные ключи или нет, и предпринять соответствующие действия в соответствии с требованиями

0 голосов
/ 05 ноября 2018

JSON, который вы опубликовали, недействителен, строка 3:

"Ankle Recovery" : {
//              / \
//  this is what you are missing

Этот инструмент поможет вам проверить структуру JSON и отформатировать ее: https://jsonlint.com/


Теперь к актуальной проблеме. Ваш JSON имеет следующую структуру:

{
    "plans": Object,
    "status": Boolean,
}

Ни одна из этих строк не является строкой (объект! = Строка, логическое значение! = Строка).
Такая структура не может быть отображена на Map<String, String>, так как для этого требуется, чтобы значение было строкой.

Вам потребуется создать несколько POJO для определения вашей структуры, а затем сопоставить их, например ::

class Project {
    public Map<String,Plan> plans;
    public Boolean status;
}

class Plan {
    public String StartDate;
    public Double Progress;
    public List<Task> tasks;
    ...
}

class Task {
    ...
}
...