java - 使用 GSON 解析 map 的 JSON map

标签 java gwt gson

我已经尝试了一切,但解决方案太丑陋了,我真的想要一个直接的答案,是否可以改进(这意味着我是否需要使用不同的实现)。

问题出在使用 GSON 的 Map of Maps 中:

根据 Firebug 给我这个响应:

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

大约有 200 "Values" ,但只有两个"Worlds" 。这是我迄今为止在我的 ControlService 中解析它的内容。类:

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

public class RegisterValues
    {
        int FirstValue;
        int SecondValue;
        ... And so on 200 times !!!

所以我像这样访问数据:

service_.RegisterValues( Names, new AsyncCallback<ControlService.RegisterValues>()
                {
                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<String[]>() {

            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<String[]> callback );

这非常有效。

我尝试以非常相似的方式进行操作,将其添加到我的 ControlService 中:

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

依此类推,确保Map<String, Map<String, Integer>>也在 onSucess()也是结构的一部分。然而,这导致我的程序崩溃。在我看来,它不喜欢嵌套 map 。但是,如果成员名称与 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<String, Map<String, Integer>> result;
    private String error;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Map<String, Map<String, Integer>> getResult() {
        return result;
    }

    public void setResult(Map<String, Map<String, Integer>> 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<String, Integer>此类的结果,可能会扩展 Map .

关于java - 使用 GSON 解析 map 的 JSON map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22637077/

相关文章:

java - 如何检查哪个子类被传递到构造函数中?

java - 切换服务器后Log4j已停止工作(Grals 2.5.1项目)

java - GWT RequestFactory 返回一个空对象

java - 当实例创建者注册到 gson 时,字段不会反序列化

java - 解析具有任意名称的 JSON 节点

java - 如何阻止在此实例中调用构造函数

java - Spring Boot应用程序中所有请求的超时异常

java - 如何在生产模式下运行 GWT

java - google web takeit with google plugin for eclipse v3.8.0 无法调试

java - 在 AsyncTask 中使用 Gson 写入/读取 JSON 时发生 android.os.TransactionTooLargeException