使用Gson如何将变量名称添加为REST调用的json的顶级参数

时间:2014-05-20 04:21:54

标签: java json rest gson

我正在尝试调用REST服务并使用gson我正在为以下java pojo获取以下json。

POJO

public class AlphaParameters {
private  int one;
private int two;
private int three;

//getter setters
//constructors
}

的Json

{"one":4,
"two":5,
"three":10
}

我正在使用以下代码

Gson gson = new Gson()
AlphaParameters alphaParameters = new AlphaParameters(one,two,three);
gson.toJson(alphaParameters );

之前这段代码曾经工作过,但现在看来.net上的服务器端改变了它们的实现,现在他们期望以下格式的json。一切都是一样的,但现在看来他们想要在json中使用顶级变量名。

{"alphaParameters":
    {"one":4,
    "two":5,
    "three":10
    }
}

问题:是否有一个特定的Gson API,我可以使用它来生成上面的json而不重构我的代码? 或者编写包装类以包含alphaParameters将是一种更好的方法。 (我将不得不为后者编写很多样板代码。)

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

我不认为Gson本身允许这种序列化,但是有很多方法可以解决这个问题,而无需创建包装类。

在我的评论中,我建议将对象放在地图中,但这有点奇怪,你可以这样做,所以它在代码中看起来更明显,可能表现更好。

public Gson wrapJson(Object objectToSerialize) {
  Gson gson = new Gson();
  JsonObject result = new JsonObject();
  //Obtain a serialized version of your object
  JsonElement jsonElement = gson.toJsonTree(objectToSerialize);
  result.add(objectToSerialize.getClass().getSimpleName(), jsonElement);
  return result;
}

然后你可以像这样使用它:

AlphaParameters alphaParameters = new AlphaParameters(one,two,three);
wrapJson(alphaParameters);

这允许您在不编写样板类的情况下在每种情况下使用一个非常通用的方法。

我使用类名来生成密钥,但随意修改它,因为它适合您。您可以将密钥名称作为参数传递,以使此包装实用程序更加灵活。