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

时间:2012-07-24 10:15:31

标签: java json jackson

如下面的代码:

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<innerPerson, String> map = new HashMap<innerPerson,String>();

        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"}

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

4 个答案:

答案 0 :(得分:32)

  

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

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

  

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

使用Gson库是可能的。

Gson gson =新的GsonBuilder()。enableComplexMapKeySerialization()。create(); gson.toJson(map);