6

我一直在寻找谷歌试图解决这个问题,但我似乎做不到。我有以下 json 字符串,该字符串从我需要与之交互的另一个源返回到我的 java 小程序。

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

目前我不确定我应该如何使用 Gson 将其解析到我的小程序中。当我与该程序的设计者交谈时。json 字符串是为 php 而不是 java 设计的,所以当我在 php 中对其进行解码时,它给了我一个很好的多维 assoc 数组。

对此有任何建议。

4

3 回答 3

7

PHP 中的关联数组转换为MapJava 中的 a。因此,在 Gson 的眼中,您的 JSON 格式是Map<String, Event>Event具有字段statustime.

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键,其值成为 的EventMap。您可能需要添加另一个自定义反序列化程序以Timejava.util.Date.

作为另一种选择,您也可以Map<String, Map<String, String>>改用。

于 2010-11-23T14:07:39.063 回答
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();
}
于 2010-11-23T14:15:54.190 回答
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

然后,您可以根据需要使用对象列表。

(进一步阅读在这里

于 2010-11-23T13:44:18.790 回答