Кодирование объекта Java (POJO) в строку JSON в 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 для анализа объекта в "String", но не смог не могу понять, что мне нужно <inherits> в моем файле gwt.xml.

Какие-нибудь мысли?


person fiz    schedule 02.04.2014    source источник


Ответы (1)


Попробуй это

List<List<String>> params;

вместо

Map<String, String> params;

в вашем классе Params POJO.

Прочитайте мой пост здесь о Как создать структуру класса POJO из строки JSON.


ниже строки JSON

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

представляет собой List<List<String>>, где «params» — это имя переменной в вашем 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 обратно клиенту.

person Braj    schedule 02.04.2014
comment
Спасибо за подробный и хорошо изложенный ответ - person fiz; 02.04.2014