将Java对象(PO​​JO)编码为GWT中的JSON字符串

时间:2014-04-02 11:14:09

标签: java json gwt json-rpc resty-gwt

目的

我想使用JSON-RPC在客户端发送它:

{"jsonrpc":"2.0","method":"RegisterValues","params":[["Planets","Stars"]],"id":2}

我的尝试

使用Resty-GWT:

public interface testService extends RestService {

    @Produces("application/json")
    @POST
    public void myCall(Params myparams, MethodCallback<Response> callback );

    public class Params {
          String jsonrpc = "2.0";
          String method;
          //String[] params;
          Map<String, String> params;
          int id;

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

          public void setMethod(String method){
              this.method = method;
          }
                          }

          public void setParams(Map<String, String> params){
              this.params = params;
          }

        }

当我调用另一个类中的Params对象(设置调用)时,做这样的事情:

Map<Integer, String> myParams = new HashMap<Integer, String>(); 
myParams.put(0, "Planets");
myParams.setParams(myParams);

显然,这就像发送它一样:

{"jsonrpc":"2.0", "method":"RegisterValues", "params":{"0":"Planets"}, "id":0}

我无法弄清楚如何获得这些魔力:[["Planets"]]

我尝试使用String[],但这会给我结果:["Planets"]

String[][]给出了尚未支持的错误。

可怕的黑客

如果我在String中传递testService作为:

String myparams = "{\"jsonrpc\":\"2.0\",\"method\":\"RegisterValues\",\"params\":[[\"FPlanets\"]],\"id\":2}";

它有效,但显然这很可怕。

我尝试使用GSON对POJO进行编码,但GWT不允许反射。我尝试使用thetransactioncompany将对象解析为“字符串”,但无法找出我<inherits>文件中所需的gwt.xml

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

试试这个

List<List<String>> params;

而不是

Map<String, String> params;

在您的Params POJO课程中。

请在此处阅读我的帖子How to create a POJO class structure from an JSON string


低于JSON字符串

"params":[["Planets","Stars"]]

表示List<List<String>>,其中“params”是POJO中的变量名称。

POJO:

class Params implements Serializable {
    private String jsonrpc;
    private String method;
    private int id;
    private List<List<String>> params;
    ...
   //getter/setter
   //default constructor
}

在服务器端尝试这个

String myparams = "{\"jsonrpc\":\"2.0\",\"method\":\"RegisterValues\",\"params\":[[\"FPlanets\"]],\"id\":2}";
Params params=gson.fromJson(myparams,Params.class);
System.out.println(params.params+"-"+params.id);

Params对象发回客户端。