2016-11-02 30 views
0

我有一个简单的问题,但我自己找不到解决方案。序列化/反序列化JSON Jackson HashMap JAVA

我需要序列化两个地图。一个有Object作为键和Integer作为值。另一个具有相似的属性,但键对象包含一个列表。

这是我的模特。

详细

package Model; 


/** 
* Created by kh0ma on 01.11.16. 
*/ 
public class Detail { 
    private String name; 

    public Detail() { 
    } 

    public Detail(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "Detail{" + 
       "name='" + name + '\'' + 
       '}'; 
    } 
} 

机制

package Model; 



import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 
import com.fasterxml.jackson.databind.annotation.JsonNaming; 
import com.fasterxml.jackson.databind.annotation.JsonSerialize; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by kh0ma on 01.11.16. 
*/ 
public class Mechanism { 
    private String name; 
    private List<Detail> details; 

    public Mechanism(String name) { 
     this.name = name; 
     this.details = new ArrayList<Detail>(); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    public List<Detail> getDetails() { 
     return details; 
    } 

    public void setDetails(List<Detail> details) { 
     this.details = details; 
    } 

    @Override 
    public String toString() { 
     return "Mechanism{" + 
       "name='" + name + '\'' + 
       ", details=" + details + 
       '}'; 
    } 
} 

然后,我被另一个类上拉在地图数据。

PullData

package PullData; 

import Model.Detail; 
import Model.Mechanism; 

import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by kh0ma on 01.11.16. 
*/ 
public class PullData { 
    public static Map<Detail,Integer> DETAILS = new HashMap<Detail, Integer>(); 

    public static Map<Mechanism,Integer> MECHANISMS = new HashMap<Mechanism, Integer>(); 


    private static Detail detail1 = new Detail("Wheel"); 
    private static Detail detail2 = new Detail("Frame"); 
    private static Detail detail3 = new Detail("Seat"); 
    private static Detail detail4 = new Detail("Engine"); 
    private static Detail detail5 = new Detail("Headlight"); 

    public static void pullDetails() 
    { 

     DETAILS.put(detail1,6); 
     DETAILS.put(detail2,2); 
     DETAILS.put(detail3,5); 
     DETAILS.put(detail4,1); 
     DETAILS.put(detail5,2); 
    } 

    public static void pullMechanisms() 
    { 
     Mechanism car = new Mechanism("Car"); 

     car.getDetails().add(detail1); 
     car.getDetails().add(detail2); 
     car.getDetails().add(detail3); 
     car.getDetails().add(detail4); 
     car.getDetails().add(detail5); 

     Mechanism bicycle = new Mechanism("Bicycle"); 

     bicycle.getDetails().add(detail1); 
     bicycle.getDetails().add(detail2); 

     MECHANISMS.put(car,1); 
     MECHANISMS.put(bicycle,1); 
    } 
} 

比我尝试序列化和反序列化的主要方法地图。

TestJSON

package TestJSON; 

import Model.Detail; 
import Model.Mechanism; 
import PullData.PullData; 
import com.fasterxml.jackson.core.JsonGenerationException; 
import com.fasterxml.jackson.core.type.TypeReference; 
import com.fasterxml.jackson.databind.JsonMappingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.type.MapType; 


import java.io.File; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by kh0ma on 01.11.16. 
*/ 
public class TestJSON { 
public static void main(String[] args) { 
    PullData.pullDetails(); 
    PullData.pullMechanisms(); 

    System.out.println("=+=+=+=BEFORE JSON SERIALISATION=+=+=+="); 

    System.out.println("-=-=-=-=-=Before changes=-=-=-=-=-=-"); 

    PullData.DETAILS.forEach((k, v) -> System.out.println(k)); 
    PullData.MECHANISMS.forEach((k, v) -> System.out.println(k)); 

    System.out.println("-=-=-=-=-=After changes=-=-=-=-=-=-"); 

    PullData.MECHANISMS.forEach((k, v) -> { 
     if (k.getName().equals("Bicycle")) k.getDetails() 
       .forEach((detail -> detail.setName(detail.getName() + "FirstChanges"))); 
    }); 

    PullData.DETAILS.forEach((k, v) -> System.out.println(k)); 
    PullData.MECHANISMS.forEach((k, v) -> System.out.println(k)); 

    System.out.println("=+=+=+=JSON Print=+=+=+="); 

    ObjectMapper objectMapper = new ObjectMapper(); 

    File jsonFileDetails = new File("src/main/resources/json/jsonDetails.txt"); 
    File jsonFileMechanisms = new File("src/main/resources/json/jsonMechanisms.txt"); 

    try { 
     objectMapper.writerWithDefaultPrettyPrinter().writeValue(jsonFileDetails, PullData.DETAILS); 
     objectMapper.writerWithDefaultPrettyPrinter().writeValue(jsonFileMechanisms, PullData.MECHANISMS); 
    } catch (JsonGenerationException e) { 
     e.printStackTrace(); 
    } catch (JsonMappingException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("=+=+=+=AFTER JSON SERIALISATION=+=+=+="); 

    System.out.println("-=-=-=-=-=Before changes=-=-=-=-=-=-"); 

    ObjectMapper mapper = new ObjectMapper(); 

    MapType mapType = mapper.getTypeFactory().constructMapType(HashMap.class, Mechanism.class, Integer.class); 

    Map<Detail, Integer> detailesAfterJson = new HashMap<Detail, Integer>(); 
    Map<Mechanism, Integer> mechanismsAfterJson = new HashMap<Mechanism, Integer>(); 

    try { 
     detailesAfterJson = mapper.readValue(jsonFileDetails, new TypeReference<HashMap<Detail, Integer>>() {}); 
     mechanismsAfterJson = mapper.readValue(jsonFileMechanisms, new TypeReference<Map<Mechanism, Integer>>() {}); 
    } catch (JsonGenerationException e) { 
     e.printStackTrace(); 
    } catch (JsonMappingException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    detailesAfterJson.forEach((k, v) -> System.out.println(k)); 
    mechanismsAfterJson.forEach((k, v) -> System.out.println(k)); 
    } 
} 

首先序列化映射这样。

jsonDetails.txt

{ 
    "Detail{name='WheelFirstChanges'}" : 6, 
    "Detail{name='FrameFirstChanges'}" : 2, 
    "Detail{name='Seat'}" : 5, 
    "Detail{name='Engine'}" : 1, 
    "Detail{name='Headlight'}" : 2 
} 

而另一个这样的。

jsonMechanisms.txt

{ 
    "Mechanism{name='Car', details=[Detail{name='WheelFirstChanges'}, Detail{name='FrameFirstChanges'}, Detail{name='Seat'}, Detail{name='Engine'}, Detail{name='Headlight'}]}" : 1, 
    "Mechanism{name='Bicycle', details=[Detail{name='WheelFirstChanges'}, Detail{name='FrameFirstChanges'}]}" : 1 
} 

在Java控制台我有这样的输出。

console_output

/usr/lib/jvm/jdk1.8.0_102/bin/java -Didea.launcher.port=7544 -Didea.launcher.bin.path=/home/kh0ma/idea-IU-162.1121.32/bin -Dfile.encoding=UTF-8 -classpath "/usr/lib/jvm/jdk1.8.0_102/jre/lib/charsets.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/deploy.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/ext/dnsns.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/ext/jaccess.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/ext/jfxrt.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/ext/localedata.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/ext/nashorn.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/ext/sunec.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/ext/zipfs.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/javaws.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/jce.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/jfr.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/jfxswt.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/jsse.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/management-agent.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/plugin.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/resources.jar:/usr/lib/jvm/jdk1.8.0_102/jre/lib/rt.jar:/home/kh0ma/Dropbox/JavaStuding/JavaRush/JavaRushHomeWork/Test JSON for ANTONIOPRIME/target/classes:/home/kh0ma/Dropbox/JavaStuding/JavaRush/JavaRushHomeWork/Test JSON for ANTONIOPRIME/lib/gson-2.7.jar:/home/kh0ma/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.2.3/jackson-databind-2.2.3.jar:/home/kh0ma/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.2.3/jackson-annotations-2.2.3.jar:/home/kh0ma/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.2.3/jackson-core-2.2.3.jar:/home/kh0ma/idea-IU-162.1121.32/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain TestJSON.TestJSON 
=+=+=+=BEFORE JSON SERIALISATION=+=+=+= 
-=-=-=-=-=Before changes=-=-=-=-=-=- 
Detail{name='Wheel'} 
Detail{name='Frame'} 
Detail{name='Seat'} 
Detail{name='Engine'} 
Detail{name='Headlight'} 
Mechanism{name='Car', details=[Detail{name='Wheel'}, Detail{name='Frame'}, Detail{name='Seat'}, Detail{name='Engine'}, Detail{name='Headlight'}]} 
Mechanism{name='Bicycle', details=[Detail{name='Wheel'}, Detail{name='Frame'}]} 
-=-=-=-=-=After changes=-=-=-=-=-=- 
Detail{name='WheelFirstChanges'} 
Detail{name='FrameFirstChanges'} 
Detail{name='Seat'} 
Detail{name='Engine'} 
Detail{name='Headlight'} 
Mechanism{name='Car', details=[Detail{name='WheelFirstChanges'}, Detail{name='FrameFirstChanges'}, Detail{name='Seat'}, Detail{name='Engine'}, Detail{name='Headlight'}]} 
Mechanism{name='Bicycle', details=[Detail{name='WheelFirstChanges'}, Detail{name='FrameFirstChanges'}]} 
=+=+=+=JSON Print=+=+=+= 
=+=+=+=AFTER JSON SERIALISATION=+=+=+= 
-=-=-=-=-=Before changes=-=-=-=-=-=- 
Detail{name='Detail{name='Engine'}'} 
Detail{name='Detail{name='Seat'}'} 
Detail{name='Detail{name='Headlight'}'} 
Detail{name='Detail{name='WheelFirstChanges'}'} 
Detail{name='Detail{name='FrameFirstChanges'}'} 
Mechanism{name='Mechanism{name='Bicycle', details=[Detail{name='WheelFirstChanges'}, Detail{name='FrameFirstChanges'}]}', details=[]} 
Mechanism{name='Mechanism{name='Car', details=[Detail{name='WheelFirstChanges'}, Detail{name='FrameFirstChanges'}, Detail{name='Seat'}, Detail{name='Engine'}, Detail{name='Headlight'}]}', details=[]} 

Process finished with exit code 0 

正如你所看到的地图前,有分歧后,但我需要绝对相同的地图。

你能告诉我解决方案吗?

我下载了GitHub仓库的分支。

JSON_TEST

谢谢您的回答。

+0

“key-object contains a list”[JSON](http:// json。org /)键必须是字符串。 –

回答

0

在JSON中,键必须是字符串。您的实施使用DetailMechanism作为关键字的toString方法。由于这些方法返回不同的字符串,所以JSON密钥将会不同。

如果您想序列化为JSON,我建议不要使用除字符串以外的其他任何东西作为映射键。