一、介绍
使用jaskson需要三个核心包:jackson-annotations jackson-core jackson-databind
代码中使用的自定义javabena:
public class User {
private String username;
private String password;
private int age;
private double salary;
public User() {
super();
}
public User(String username, String password, int age, double salary) {
super();
this.username = username;
this.password = password;
this.age = age;
this.salary = salary;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", age=" + age + ", salary=" + salary
+ "]";
}
}
二、将javabean转为json
public void jacksonTest01() throws IOException {
User user1 = new User("admin","123456",25,12.345);
User user2 = new User("trans","trans",30,1.01);
ObjectMapper objectMapper = new ObjectMapper();
JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createGenerator(System.out,JsonEncoding.UTF8);
//writeObject可以转换java对象,当然不仅仅是单纯的javabean,还有map,array等
jsonGenerator.writeObject(user1);
//writeValue具有和writeObject相同的功能
objectMapper.writeValue(System.out, user2);
}
输出结果:
{"username":"admin","password":"123456","age":25,"salary":12.345}{"username":"trans","password":"trans","age":30,"salary":1.01}
三、将map转换为json
public void jacksonTest02() throws IOException{
Map<String,Object> map = new HashMap<String,Object>();
map.put("username","lwb");
map.put("password","admin");
map.put("age",213);
ObjectMapper objectMapper = new ObjectMapper();
JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createGenerator(System.out, JsonEncoding.UTF8);
jsonGenerator.writeObject(map);
}
输出结果:
{"password":"admin","age":213,"username":"lwb"}
四、将List转化为json
public void jacksonTest03() throws IOException{
List<Map<String,Object>> arrayList = new ArrayList<Map<String,Object>>();
Map<String,Object> map = new HashMap<String,Object>();
Map<String,Object> map1 = new HashMap<String,Object>();
map.put("username","lwb");
map.put("password","admin");
map.put("age",213);
map1.put("username","lwb");
map1.put("password","admin");
map1.put("age",213);
arrayList.add(map);
arrayList.add(map1);
ObjectMapper objectMapper = new ObjectMapper();
JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createGenerator(System.out, JsonEncoding.UTF8);
jsonGenerator.writeObject(arrayList);
}
输出结果:
[{"password":"admin","age":213,"username":"lwb"},{"password":"admin","age":213,"username":"lwb"}]
五、jackson的api练习
public void jacksonTest04() throws IOException{
String str = "hello world jackson!";
ObjectMapper objectMapper = new ObjectMapper();
JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createGenerator(System.out,JsonEncoding.UTF8);
sonGenerator.writeBoolean(true);
jsonGenerator.writeNumber(344);
jsonGenerator.writeBoolean(true);
//null
jsonGenerator.writeNull();
//float
jsonGenerator.writeNumber(2.2f);
//char
jsonGenerator.writeRaw("c");
//String
jsonGenerator.writeRaw(str, 5, 10);
//String
jsonGenerator.writeRawValue(str, 5, 5);
//String
jsonGenerator.writeString(str);
jsonGenerator.writeTree(JsonNodeFactory.instance.pojoNode(str));
jsonGenerator.flush();
System.out.println();
//在没有bean的情况之下,也可以按照自己想要的格式输出
String[] arr = {"1","波波"};
jsonGenerator.writeStartObject();
jsonGenerator.writeObjectFieldStart("user");
jsonGenerator.writeStringField("username","lwb");
jsonGenerator.writeNumberField("age", 23);
jsonGenerator.writeObjectField("info", arr);
jsonGenerator.writeEndObject();
jsonGenerator.writeEndObject();
jsonGenerator.flush();
jsonGenerator.close();
}
输出结果:
true 344 true null 2.2c world jac worl "hello world jackson!" "hello world jackson!"
{"user":{"username":"lwb","age":23,"info":["1","波波"]}}
{"user":{"username":"lwb","age":23,"info":["1","波波"]}}
六、将JSON字符串写入到文件中
public void jacksonTest06() throws IOException{
User user = new User("admin","123456",25,12.345);
ObjectMapper objectMapper = new ObjectMapper();
//但是对于复杂的数据类型,Jackson Generator必须从ObjectMapper.getJsonFactory()的JsonFactory中创建,否则会报一下错误:
//JsonFactory jsonFactory = new JsonFactory();
//JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File("C:/output.json"), JsonEncoding.UTF8);
OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("C:/output.json")));
JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(out, JsonEncoding.UTF8);
jsonGenerator.writeObject(user);
out.flush();
jsonGenerator.flush();
out.close();
jsonGenerator.close();
}
七、得到JSON字符串
public void jacksonTest07() throws JsonProcessingException {
User user = new User("admin","123456",25,12.345);
ObjectMapper objectMapper = new ObjectMapper();
String userStr = objectMapper.writeValueAsString(user);
System.out.println(userStr);
}
八、将JSON字符串转化为java对象
public void jacksonTest08() throws Exception {
String json = "{\"_index\":\"hw_alarm_20180613\",\"_type\":\"system\",\"_id\":\"AWP2qOxxzJrjbyAxqXXE\",\"_version\":1,\"_score\":1,\"_source\":{\"@version\":\"1\",\"@timestamp\":\"2018-06-13T01:00:55.203Z\",\"path\":\"/export/home/linkage/I2jmsReceiver/alarmdata/SICHUAN6_AlarmType_20180613.txt\",\"host\":\"znwg-kfscswg2\",\"type\":\"system\",\"CLEARANCETIMESTAMP\":\"2018-06-1309:00:43\",\"SEND_TIME\":\"2018-06-1309:00:54\",\"SUBNETWORK\":\"绵阳市县华为OTN80*10G01\",\"EQUIPMENTNAME\":\"202-38-绵阳236局\",\"ALARMTEXT\":\"aliasNameList#NativeEMSName=202-38-绵阳236局,X733_SpecificProblems#(1)支持并激活复用结构的自动配置时,如果特定适配功能不支持实收MSI的无效值时声明MSIM缺陷;(2)不支持或未激活复用结构的自动配置时,如果实收MSI不等于应收MSI时声明MSIM缺陷。,additionalText#,serviceAffecting#SERVICE_AFFECTING,sourceTime#2018-06-13T01:00:43.000Z,X733_AdditionalInformation#AlarmSerialNo=635060890;StandardAlarmCode=C9999,X733_CorrelatedNotificationList#,acknowledgeIndication#UNACKNOWLEDGED,objectType#FTP,probableCause#probableCause=UNIDENTIFIED,perceivedSeverity#MINOR,osTime#2018-06-13T01:00:53.000Z,layerRate#LR_OCH_Data_Unit_2,nativeProbableCause#OPU2_MSIM,objectName#MD=Huawei/U2000;ME=3156449;FTP=/rack=1/shelf=3/slot=5/domain=wdm/port=52,rootCauseAlarmIndication#false,notificationId#5617885,X733_EventType#communicationsAlarm,isClearable#true,BOARDNAME#52ND2\",\"ALARMORIGIN\":\"EMS=SICHUAN6\",\"ADDITIONALTEXT\":\"EMS=SICHUAN6;MD=Huawei/U2000;ME=3156449;FTP=/rack=1/shelf=3/slot=5/domain=wdm/port=52\",\"PERCEIVEDSEVERITY\":\"3\",\"REGTYPE\":\"绵阳SCTHWDWDM\",\"EVENTTIME\":\"2018-06-1309:00:53\",\"SPECIALTY\":\"TRA\",\"NECLASS\":\"SCTHWDWDM\",\"CLEARANCEREPORTFLAG\":\"1\",\"isClearable\":\"1\",\"ALARMNAME\":\"OPU2_MSIM\",\"LOCATIONINFO\":\"EMS=SICHUAN6;MD=Huawei/U2000;ME=3156449;FTP=/rack=1/shelf=3/slot=5/domain=wdm/port=52\",\"SERIAL\":\"635060890\",\"REPAIRACTIONADVICE\":\"(1)支持并激活复用结构的自动配置时,如果特定适配功能不支持实收MSI的无效值时声明MSIM缺陷;(2)不支持或未激活复用结构的自动配置时,如果实收MSI不等于应收MSI时声明MSIM缺陷。\",\"IPADDRESS\":\"133.37.22.107\",\"ALARMREASON\":\"OPU2复用结构标识符失配\",\"EQUIPMENTNAME_ALIAS\":\"202-38-绵阳236局\",\"REGION\":\"绵阳\"}}";
ObjectMapper objectMapper = new ObjectMapper();
Map<String,Object> map = objectMapper.readValue(json, Map.class);
Set<String> set = map.keySet();
for (String string : set) {
System.out.println(map.get(string));
if(map.get(string) instanceof Map) {
Map resource = (Map)map.get(string);
Set<String> keySet = resource.keySet();
for (String object : keySet) {
System.out.println(resource.get(object));
}
}
}
}
九、将xml转换为javabena
需要用到额外的包:jackson-dataformat-xml jackson-module-jaxb-annotationspublic void jacksonTest09() throws Exception {
//扩展实例知识(XStream的内容,可以不用管)
User user = new User("admin","123456",25,12.345);
XStream xStream = new XStream();
xStream.autodetectAnnotations(true);
xStream.alias("user",User.class);//重新命名类
// xStream.aliasField("name",User.class,"username");//为类的字段重新命名
String xmlStr = xStream.toXML(user);
System.out.println(xmlStr);
/////////////////////////////////
//将javabean转换为xml
XmlMapper xm = new XmlMapper();
//将xml 转换为javabean--> user
XmlMapper xml = new XmlMapper();
User user2 = xml.readValue(xmlStr, User.class);
System.out.println(user2);
ObjectMapper objectMapper = new ObjectMapper();
//转换为Map
Map map = xml.readValue(xmlStr, Map.class);
System.out.println(map);
//转换复杂的xml
String str = "<root><data><msgBody><accessCode>接入号(20180425)</accessCode><cirLevel>钻</cirLevel><portType>28</portType><orderCode>20180426111111111</orderCode><cirName>测试电路</cirName><localnet>成都</localnet><resOperatlon>1</resOperatlon><newInfoList><newInfo><aPortId>EMS=SICHUAN6;MD=Huawei/U2000;ME=3148726;PTP=/rack=1/shelf=0/slot=20/domain=wdm/port=4;CTP=/odu0=1</aPortId><aPortSdhctp>VC4:1-VC12(1-1-1)</aPortSdhctp><aVcBreak>1</aVcBreak><zPortId>EMS=SICHUAN6;MD=Huawei/U2000;ME=3148003;PTP=/rack=1/shelf=0/slot=33/domain=wdm/port=8;CTP=/odu0=1</zPortId><zPortSdhctp>VC4:1-VC12(1-1-1)</zPortSdhctp><zVcBreak>1</zVcBreak><rate>1GE</rate></newInfo><newInfo><aPortId>EMS=SICHUAN6;MD=Huawei/U2000;ME=3148726;PTP=/rack=1/shelf=0/slot=20/domain=wdm/port=4;CTP=/odu0=1</aPortId><aPortSdhctp>VC4:1-VC12(1-1-1)</aPortSdhctp><aVcBreak>1</aVcBreak><zPortId>EMS=SICHUAN6;MD=Huawei/U2000;ME=3148003;PTP=/rack=1/shelf=0/slot=33/domain=wdm/port=8;CTP=/odu0=1</zPortId><zPortSdhctp>VC4:1-VC12(1-1-1)</zPortSdhctp><zVcBreak>1</zVcBreak><rate>1GE</rate></newInfo></newInfoList><oldInfoList><newInfo><aPortId>EMS=SICHUAN6;MD=Huawei/U2000;ME=3147312;PTP=/rack=1/shelf=0/slot=11/domain=sdh/port=1;CTP=/sts12c_vc4_4c=13</aPortId><zPortId>EMS=SICHUAN6;MD=Huawei/U2000;ME=3148656;PTP=/rack=1/shelf=0/slot=8/domain=wdm/port=1;CTP=/och=1</zPortId><rate>1GE</rate></newInfo><newInfo><aPortId>EMS=SICHUAN6;MD=Huawei/U2000;ME=3147312;PTP=/rack=1/shelf=0/slot=11/domain=sdh/port=1;CTP=/sts12c_vc4_4c=13</aPortId><zPortId>EMS=SICHUAN6;MD=Huawei/U2000;ME=3148656;PTP=/rack=1/shelf=0/slot=8/domain=wdm/port=1;CTP=/och=1</zPortId><rate>1GE</rate></newInfo></oldInfoList></msgBody></data></root>";
Map map2 = xml.readValue(str, Map.class);
System.out.println(map2);
//直接转换为object呢?
Object map3 = xml.readValue(str, Object.class);
System.out.println(map3);
}