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仓库的分支。
谢谢您的回答。
“key-object contains a list”[JSON](http:// json。org /)键必须是字符串。 –