2010-11-23 4 views
6

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

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

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

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

ответ

7

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

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

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

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

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

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

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

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

1

Если 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 

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

(далее перечитывая here)

2

Эта ссылка указывала на то, на что я даже не смотрел. Я также забыл упомянуть в своем посте, что Знание 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(); 
} 
+0

Большинство библиотек JSON имеют одну или две линейные операции, чтобы сделать то же самое; там не должно быть необходимости вручную писать этот код. С Gson я думаю, вам нужно будет передать TypeToken >, чтобы получить намеченный результат. – StaxMan 2010-11-23 20:31:27

 Смежные вопросы

  • Нет связанных вопросов^_^