Чтение JSon String с Gson - PullRequest
       7

Чтение JSon String с Gson

6 голосов
/ 23 ноября 2010

Я копался в Google, пытаясь выяснить это, но я не могу этого сделать.У меня есть следующая строка json, которая возвращается в мой java-апплет из другого источника, с которым мне нужно взаимодействовать.

{
 "A01": {"Status": "Ready", "Time": "00:00"}, 
 "A02": {"Status": "Ready", "Time": "00:00"}, 
 ......
}

В настоящее время я не уверен, как мне следует использовать Gson для анализа этого в моемапплет.Когда я разговаривал с дизайнерами этой программы.Строка json была разработана для использования в php, а не в java, поэтому, когда я декодировал ее в php, это дало мне хороший многомерный ассоциативный массив.

Любые предложения по этому вопросу.

Ответы [ 3 ]

7 голосов
/ 23 ноября 2010

Ассоциативный массив в PHP переводится как Map в Java.Итак, в глазах Gson ваш JSON имеет формат Map<String, Event>, где класс Event имеет поля status и time.

public class Event {
    private String Status;
    private String Time;

    // Add/generate getters, setters and other boilerplate.
}

Да, имена полей с заглавными буквами некрасивы, ноВот как выглядит ваш JSON.В противном случае вам потребуется создать пользовательский десериализатор Gson .

Вот как вы можете его преобразовать.

Map<String, Event> events = new Gson().fromJson(json, new TypeToken<Map<String, Event>>(){}.getType());

A01, A02 и т. Д. Становятся Map и его значение становится Event значением Map.Возможно, вы захотите добавить другой пользовательский десериализатор, чтобы получить Time в java.util.Date.

В качестве другой альтернативы, вы также можете использовать Map<String, Map<String, String>> вместо.

2 голосов
/ 23 ноября 2010

Эта ссылка указала мне на то, на что я даже не смотрел.Я также забыл упомянуть в своем посте, что знание A01, A02 и т. Д. Очень важно.Но ссылка в посте, на которую вы мне указали, заставила меня придумать, что работает для меня.

JsonParser parse = new JsonParser();
JsonObject jobj = (JsonObject)parse.parse(status);                            
Set<Map.Entry<String, JsonElement>> map = jobj.entrySet();
Iterator<Map.Entry<String, JsonElement>> iterator = map.iterator();
int size = map.size();
for( int k = 0; k < size; k++ )
{
    Map.Entry<String, JsonElement> entry = iterator.next();
    String key = entry .getKey();
    JsonObject jele = (JsonObject)entry.getValue();
}
1 голос
/ 23 ноября 2010

Если ваш JSON немного отличается, как показано ниже:

{
 [
  {"Status": "Ready", "Time": "00:00"}, 
  {"Status": "Ready", "Time": "00:00"}, 
  ......
 ]
}

Gson сможет конвертировать JSON в коллекцию объектов, объект, который вы должны будете определить сами. Так что вам нужно:

public class myAClass {
public String Status;
public Double time; //this could be a string/or even a Date I guess, 
                    //not sure what data you are expecting
                    //and the colon may cause a problem if parsed as a double
}

А затем используйте это так:

Type listType = new TypeToken<List<myAClass>>() {}.getType();
List<myAClass> myAClassList = new Gson().fromJson(json, listType); 
//where json is yr json string

Затем вы можете использовать список объектов по своему усмотрению.

(дальнейшее чтение здесь )

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