我们可以在使用JSON时将对象设置为地图中的键吗?

如下面的代码:

public class Main { public class innerPerson{ private String name; public String getName(){ return name; } } public static void main(String[] args){ ObjectMapper om = new ObjectMapper(); Map map = new HashMap(); innerPerson one = new Main().new innerPerson(); one.name = "david"; innerPerson two = new Main().new innerPerson(); two.name = "saa"; innerPerson three = new Main().new innerPerson(); three.name = "yyy"; map.put(one, "david"); map.put(two, "11"); map.put(three, "true"); try { String ans = om.writeValueAsString(map); System.out.println(ans); } catch (JsonGenerationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JsonMappingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

输出是:

 {"Main$innerPerson@12d15a9":"david","Main$innerPerson@10a3b24":"true","Main$innerPerson@e91f5d":"11"} 

是否可以使地图的关键字成为精确数据而不是对象的地址? 怎么样?

我们可以在使用JSON时将对象设置为地图中的键吗?

严格地说,没有。 JSON 映射数据结构是JSON 对象数据结构,它是名称/值对的集合,其中元素名称必须是字符串。 因此,尽管将JSON对象感知并绑定为映射是合理的,但JSON映射键也必须是字符串 – 再次,因为JSON映射是JSON对象。 有关JSON对象(映射)结构的规范,请访问http://www.json.org 。

是否可以使地图的关键字成为精确数据而不是对象的地址? 怎么样?

Costi正确描述了Jackson的默认映射键序列化程序的行为,它只调用Java映射键的toString()方法。 而不是修改toString()方法以返回映射键的JSON友好表示,使用Jackson实现自定义映射键序列化也是可能且相当简单。 这样做的一个例子可以在Jackson的Serializing Map 中找到 。

您看到的“地址”就是您的toString()方法返回的内容。

暂时忽略JSON编组为了使代码正常工作,您需要在InnerPerson类中实现: equals()hashCode()toString() 。 如果在toString()返回name属性,那么它将成为JSON表示中的键。

但是如果没有equals()hashCode()正确实现,则无法正确使用HashMap。

除了现有的正确答案之外,您还可以使用Module接口(通常使用SimpleModule )添加自定义键序列化器和键解串器。 这允许您从外部定义键的序列化和反序列化。 无论哪种方式,JSON中的键必须是字符串,就像其他人指出的那样。