为什么在Jersey / Tomcat中没有正确格式化这个HashMap?

时间:2017-12-06 15:42:10

标签: java json rest api jersey

我正在测试Jersey,我想要一个生成这个JSON对象的模拟端点

{
   "Flight1" : 757,
   "Flight2" : 107,
   "Flight3" : 637,
}

所以我写了这篇资源:

@GET
@Path("myjson")
@Produces(MediaType.APPLICATION_JSON)
public String getMyJson(@QueryParam ("test1") String lat, @QueryParam("test2") String lng) {
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    map.put("Flight 1", 765);
    map.put("Flight 2", 657);
    map.put("Flight 3", 908);
    return map.toString();
}

但是当我调用/ myjson

时,我得到了这个回应
  

{ Flight 1=765, Flight 2=657, Flight 3=908 }

泽西岛已经知道哪个元素是一个字符串,哪个元素是一个整数,但它的格式就好像它们是所有数字一样。 另外,现在的Json不能被&#34;漂亮的&#34;格式化。格式化程序,我相信这会使http客户端难以解析。

所以我的问题是:

  1. 为什么会这样?

  2. 如何避免它并编写简单的模拟JSON对象以进行正确格式化的测试

3 个答案:

答案 0 :(得分:1)

  

为什么会这样?

因为您只是制作HashMap的toString。 防爆。

    HashMap<String,String> stringStringHashMap = new HashMap<String, String>();
    stringStringHashMap.put("a","b");
    stringStringHashMap.put("b","b");
    stringStringHashMap.put("c","b");

将打印{b=b, c=b, a=b}

  

如何避免它并编写简单的模拟JSON对象进行测试   格式正确

你可以通过使用很多库(Gson,Jackson,JsonSimple等)来做到这一点。 因为这已经回答了你想做的事情HashMap to Json

答案 1 :(得分:1)

这与Jersey / Tomcat无关。对于核心Java编程,这是最佳toString()方法可以处理mapString的方式。

为此,您可以使用

转换为JSONObject
    String jon =  JSONObject.valueToString(map);

    System.out.println(jon);

甚至使用gson之类的

    Gson gson = new Gson();
    String json = gson.toJson(map);
    System.out.println(json);

答案 2 :(得分:1)

您可以添加Jaxb注释以直接序列化和反序列化响应对象而无需转换。为此,您需要添加jersey的jaxb库,以便在引导平台环境时启用自动转换功能。

示例:

@Path("jaxbResource")
@Produces("application/xml")
@Consumes("application/xml")
public class UserResource {
    @GET
    public User[] getUserArray() {
    List<User> userList = new ArrayList<User>();
    userList.add(new User(1, "John"));
    ………
    return userList.toArray(new User[userList.size()]);
    }
}

@XmlRootElement
public class User {
    private int id;
    private String name;

    public User() {}

    public User(int id,String name) {
        this.id = id;
        this.name = name;
    }
    ………
}

希望这有帮助!!!