2010-11-23 71 views
6

我一直在寻找谷歌试图弄清楚这一点,但我似乎无法做到这一点。我有以下json字符串从另一个我需要与之交互的源返回到我的java applet。阅读JSon与Gson的字符串

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

目前我不知道我应该如何使用Gson来解析到我的小程序。当我和那个节目的设计师谈话时。 json字符串被设计用于php而不是java,所以当我在php中解码它时,它给了我一个很好的多维关联数组。

对此有任何建议。

回答

7

关联数组转换为Java中的Map。所以,在Gson的眼中,你的JSON格式为Map<String, Event>,其中Event类的字段为statustime

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()); 

A01A02等成为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)在PHP

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