Как мне декодировать список пар строк с помощью GSON? - PullRequest
0 голосов
/ 28 января 2011

У меня есть список категорий, возвращаемых из веб-запроса, в формате JSON.Примером может быть:

"categories":[["Descriptive Cat 1 Name","cat1label"]]

Как это будет представлено в объекте?В настоящее время у меня есть объект с именем Category, и я использую его как:

private List<Category> categories;

Объект Category выглядит примерно так:

class Category {
   private String descrName;
   private String label;
    .. getters and setters..
}

При попытке декодирования с помощью GSON я получаю следующее сообщение об ошибке:

01-27 21: 44: 46.149: ОШИБКА / AndroidRuntime (843): com.google.gson.JsonParseException: Ожидается массив, но найден объект: Категория @ 437d1ff8

Какие-либо предложения?Я также был бы в порядке, если бы они возвращались в виде карты, хотя вместо K, V в результатах JSON они будут V, K, может ли это быть отображено таким образом?

Это сработает, если я все угроблю объект Category и просто сопоставлю его как:

private List<List<String,String>> categories;

Но есть ли лучший способ представить эти данные?

Ник

Ответы [ 4 ]

4 голосов
/ 28 января 2011

Как правильно заметил @ Dante617, ваше представление JSON неверно. Правильное представление

{
    "categories": [
                   {"descrName":"Descriptive Cat Name 1", "label": "cat1Label"},
                   {"descrName":"Descriptive Cat Name 2", "label": "cat2Label"}
                  ]
}

Теперь это можно представить как карту заголовка «категорий» и списка объектов категории . Таким образом, объект Java, который его отображает, будет Map<String, List<Category>>

Если вы как-то правильно переформатируете строку, как показано выше. Вот как бы вы разобрались.

    String categories = "{\"Categories\":[{\"descrName\":\"Descriptive Cat 1 Name\",\"label\":\"cat1label\"}, {\"descrName\":\"Descriptive Cat 2 Name\",\"label\":\"cat2label\"}]}";
    Gson gson = new Gson();
    Type type = new TypeToken<Map<String, List<Category>>>() {}.getType();
    Map<String, List<Category>> l = gson.fromJson(categories, type);
    System.out.println("l: " + l);

Если ваш Java-объект выглядит так

public class Category {
    private String descrName;
    private String label;
    //no need of getters and setters. Reflection, baby! :)

    @Override
    public String toString() {
        return "<Name:"+descrName+", label:"+label+">";
    }
}

Вывод будет отображаться так

 l: {Categories=[<Name:Descriptive Cat 1 Name, label:cat1label>, <Name:Descriptive Cat 2 Name, label:cat2label>]}
2 голосов
/ 28 января 2011

Я не знаком с GSON, но я не уверен, как приложение может сопоставить строки с полями в вашем объекте. Похоже, вам нужна структура JSON, похожая на:

"categories": [
               {"descrName":"Descriptive Cat Name 1", "label": "cat1Label"},
               {"descrName":"Descriptive Cat Name 2", "label": "cat2Label"}
              ]

Это может помочь в возможности динамически создавать объекты Java.

1 голос
/ 29 января 2011

Вопреки тому, что думают другие, это не является недействительным JSON.[[]] - это просто двумерный массив.В терминах Java это отображается следующим образом:

String json = "{\"categories\":[[\"Descriptive Cat 1 Name\",\"cat1label\"]]}";
Map<String, String[][]> map = new Gson().fromJson(json, new TypeToken<Map<String, String[][]>>(){}.getType());
// ...

или

String json = "{\"categories\":[[\"Descriptive Cat 1 Name\",\"cat1label\"]]}";
Map<String, List<List<String>>> map = new Gson().fromJson(json, new TypeToken<Map<String, List<List<String>>>>(){}.getType());
// ...
0 голосов
/ 29 января 2011

Спасибо за ввод, ребята. К сожалению, это общедоступный веб-сервис, которым я пользуюсь (API Yelp v2), и я не могу изменить формат возвращаемых данных. Это то, что я застрял на данный момент, который работает нормально:

private List<List<String>> categories;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...