Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用JSON时,我们可以将对象作为映射中的键吗?_Java_Json_Jackson - Fatal编程技术网

Java 在使用JSON时,我们可以将对象作为映射中的键吗?

Java 在使用JSON时,我们可以将对象作为映射中的键吗?,java,json,jackson,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()

代码如下:

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();
        }

    }

}
是否可以将地图的键设置为精确的数据,而不仅仅是对象的地址?如何打印?

您看到打印的“地址”就是您的
toString()
方法返回的地址

为了让代码正常工作,暂时不考虑JSON封送,您需要在
InnerPerson
类中实现:
equals()
hashCode()
toString()
。如果在
toString()
中返回name属性,它将成为JSON表示中的键

但是如果没有适当的
equals()
hashCode()
实现,就无法正确使用HashMap

在使用JSON时,我们可以将对象作为映射中的键吗

严格来说,不是。JSON映射数据结构是一个JSON对象数据结构,它是名称/值对的集合,其中元素名称必须是字符串。因此,尽管将JSON对象视为映射并绑定到它是合理的,但JSON映射键也必须是字符串——同样,因为JSON映射是JSON对象。JSON对象(map)结构的规范可从以下站点获得

是否可以将地图的键设置为精确的数据,而不仅仅是对象的地址?怎么做


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

除了现有的正确答案外,您还可以使用模块接口(通常使用
SimpleModule
)添加自定义密钥序列化程序和密钥反序列化程序。这允许您从外部定义键的序列化和反序列化。不管怎样,JSON中的键必须是字符串,就像其他人指出的那样。

使用Gson库是可能的

Gson Gson=new GsonBuilder().enableComplexMapKeySerialization().create();
toJson(map)

几天前我也遇到了同样的问题,发现密钥不能是pojo,jackson无法成功序列化/反序列化映射。@ShankhoneerChakrovarty是的,当我想序列化一个复杂的对象时必须小心,因为它可能包含一个以对象为密钥的映射结构!真麻烦!上面的Gson解决方案将返回json作为列表而不是映射。我解决了我的问题,找到了另一种方法,而不是返回一个对象作为键
{"Main$innerPerson@12d15a9":"david","Main$innerPerson@10a3b24":"true","Main$innerPerson@e91f5d":"11"}