用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
。