用GSON解析地图的JSON地图

我已经尝试了所有的东西,但解决方案是如此丑陋,我真的想要一个直接的答案,如果这可以改善(这意味着我需要使用不同的实现)。

问题在于使用GSON映射地图:

根据Firebug给我这个回应:

{"id": 2, "result": {"FirstWorld": {"FirstValue": 5, ... }, "SecondWorld":{"FirstValue": 5, ....}}, "error":null } 

大约有200个"Values" ,但只有两个"Worlds" 。 这是我到目前为止在我的ControlService类中解析它:

 public void RegisterValues( String [] Names, AsyncCallback<Map> callback); public class RegisterValues { int FirstValue; int SecondValue; ... And so on 200 times !!! 

所以我像这样访问数据:

 service_.RegisterValues( Names, new AsyncCallback() { public void onSuccess( GlibControlService.RegisterValues result ) { String test = "FirstValue"; String message="Result for channel 1 is "; for( String Name : result.keySet() ) message+=Name+"="+result.get(Name); 

但正如你所看到的,这将是非常漫长的。 另一个问题是一些“值”中有一些&符号,这意味着我不能在这种方法中使用它们,例如;

 @SerializedName("One&Two") // Ampersand not allowed in name int OneTwo; //gives Invalid JSON response apparently 

有没有人有更好的方法呢?

编辑代码有效:

 private ControlService service_; service_.connectedNames( new String[0], new AsyncCallback() { public void onSuccess( String[] result) { List_.removeItem(0); Names = result; for( String Name : result ) { List_.addItem(Name); } List_.setEnabled( true ); } public void onFailure(Throwable why) { List_.removeItem(0); List_.addItem( "Server error!" ); } }); 

然后在我的ControlService类中,我有这个:

 @RpcImpl(version=RpcImpl.Version.V2_0,transport=RpcImpl.Transport.HTTP_POST) public interface ControlService extends RemoteJsonService { public void connectedNames( String [] Names, AsyncCallback callback ); 

这非常有效。

我尝试通过在ControlService中添加它来以非常类似的方式执行此操作:

 public void RegisterValues( String [] Names, AsyncCallback<Map< String,Map> callback); 

依此类推,确保Map<String, Map>也在结构的onSucess()部分。 然而,这导致我的程序崩溃。 在我看来,它不喜欢嵌套的地图。 但是,如果成员名称与JSON字段匹配,GSON将自动解析对象。 所以我使用RegisterValues来自动强制GSON解析它。

堆栈跟踪:

  [ERROR] Errors in 'generated://AF9BA58B045D92E7896CD657C9CC5FAF/example/client/ControlService_JsonProxy.java' [ERROR] Line 18: INSTANCE cannot be resolved or is not a field See snapshot: /var/folders/pf/56b3mznn35gg741rlsqq424m0000gp/T/example.client.ControlService_JsonProxy2948240672238331252.java 

这就是为什么我认为GSON无法使用AsyncCallback自动解析嵌套映射。 根据您的建议,我的HTTP呼叫可能会更好。

最好的方法是将您发布的响应包装到一个类中。

 {"id": 2, "result": {"FirstWorld": {"FirstValue": 5, ... }, "SecondWorld":{"FirstValue": 5, ....}}, "error":null } 

 import java.util.Map; public class Response { private int id; private Map> result; private String error; public int getId() { return id; } public void setId(int id) { this.id = id; } public Map> getResult() { return result; } public void setResult(Map> result) { this.result = result; } public String getError() { return error; } public void setError(String error) { this.error = error; } } 

我用这个测试过,运行正常。

 static String json = "{\"id\":2,\"result\":{\"FirstWorld\":{\"FirstValue\":5,\"SecondValue\":6},\"SecondWorld\":{\"FirstValue\":5,\"SecondValue\":6}},\"error\":null}"; public static void main(String[] args) { Gson g= new Gson(); Response b=g.fromJson(json, Response.class ); System.out.println(g.toJson(b)); } 

如果需要声明RegisterValues类,则只需要将此结果的Map替换为此类,可能会扩展Map