本文将带您了解关于在Jackson中读取嵌入式对象的新内容,同时我们还将为您解释jackson嵌套对象的相关知识,另外,我们还将为您提供关于c#中中读取嵌入和使用资源文件的方法、jacksonjava
本文将带您了解关于在Jackson中读取嵌入式对象的新内容,同时我们还将为您解释jackson 嵌套对象的相关知识,另外,我们还将为您提供关于c#中中读取嵌入和使用资源文件的方法、jackson java对象和json对象的互相转换、Jackson-Java bean到JSON字符串:大写变量在JSON中转换为小写、Jackson中json格式的字符串与对象的互相转换方式的实用信息。
本文目录一览:- 在Jackson中读取嵌入式对象(jackson 嵌套对象)
- c#中中读取嵌入和使用资源文件的方法
- jackson java对象和json对象的互相转换
- Jackson-Java bean到JSON字符串:大写变量在JSON中转换为小写
- Jackson中json格式的字符串与对象的互相转换方式
在Jackson中读取嵌入式对象(jackson 嵌套对象)
我正在尝试使用Jackson 2.0-RC3读取旧版JSON代码,但是我陷入了“嵌入式”对象的困境。
给定以下JSON:
{ "title": "Hello world!", "date": "2012-02-02 12:23:34". "author": "username", "author_avatar": "http://.../", "author_group": 123, "author_prop": "value"}
如何将其映射到以下结构:
class Author { @JsonPropery("author") private String name; @JsonPropery("author_avatar") private URL avatar; @JsonProperty("author_group") private Integer group; ...}class Item { private String title; @JsonProperty("date") private Date createdAt; // How to map this? private Author author;}
我试图这样做,@JsonDeserialize
但似乎我必须以Item
这种方式映射整个对象。
答案1
小编典典要处理“嵌入式”对象,您应该使用@JsonUnwrapped
它-等同于Hibernate的@Embeddable
/ @Embedded
。
class Item { private String title; @JsonProperty("date") private Date createdAt; // How to map this? @JsonUnwrapped private Author author;}
c#中中读取嵌入和使用资源文件的方法
Dotnet中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Stream。另一种方法是在项目中加入. resx资源文件,在资源文件中添加资源,由ResourceManager类统一管理其中的资源。
下面分别详述这两种方法
一、使用GetManifestResourceStream读取嵌入资源
1、加入资源文件
直接把要嵌入到程序集的资源文件加入到项目中,可以加在项目的根目录,可以加在项目的任何目录中。
2、设置资源文件的“BuildAction”属性
将嵌入资源文件的“BuildAction”属性设置为“Embedded Resource”
3、代码中使用嵌入资源
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
注意资源名称的组成规则:
项目默认名称空间.资源在项目中所在目录.资源文件名
上面代码中BitmapManifest.bmp位图就在项目的directory目录下。如果资源文件直接在项目根目录,则为项目默认名称空间.资源文件名
再给一个xml资源的例子:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
二、使用. resx资源文件嵌入资源
1、新建资源文件
在项目中新建一个资源文件,资源文件以.resx为后缀,同时还会新建一个跟资源文件同名的Designer.cs文件。
其实资源文件最大的用处是用来做多语言版本的软件时保存不同语言的资源,比如不同语言的菜单文本,可以把不同语言的字符串放在同一个资源类型下的不同资源包中,程序运行时根据运行时系统的culture选择不同的包显示不同语言的字符串。
新建了资源文件后就能往资源文件中添加资源文件:
图1 .resx资源文件可嵌入的资源类型
资源中可以添加字符串、位图、图标、音频、文件等等的资源。
添加的资源都会被保存在项目的Resources文件夹中。
2、设置资源文件的“BuildAction”属性
Resources文件夹中的所有资源文件的“BuildAction”属性设置为“Embedded Resource”。
3、 资源存在方式
.resx资源文件管理的资源可以用两种存在形式,一种是以一般的文件形式存在于Resources文件夹中,另一个是经过Base64编码后嵌入到.resx资源文件中。
图2 .resx资源文件中资源存在方式
打开.resx资源文件,选择资源,在属性中Persistence属性决定资源的存在形式。资源的两种存在形式,在代码中调用都是一样的。
4、 代码中使用嵌入资源
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
注意资源的根名称的规则:
资源的根名称就是这个资源文件类的全名称。
打开.resx资源文件相应的Designer.cs文件能看到资源类的全名称:名称空间.资源类名。
资源名就是某个资源在.resx资源文件中的名称。
打开.resx资源文件可以看到各个资源的名称。上面图中图标文件IconTest.ico的名称是IconTest。
若要检索“字符串”资源,请调用 GetString 方法。
若要检索其他类型的资源,请调用 GetObject 方法,并将得到的资源显式转换成对应的类型。
5、多语言的资源应用
?
1 2 3 4 5 |
|
jackson java对象和json对象的互相转换
概述
Jackson框架是基于Java平台的一套数据处理工具,被称为“最好的Java Json解析器”。
Jackson框架包含了3个核心库:streaming,databind,annotations.Jackson还包含了其它数据处理类库,此外不作说明。
Jackson版本: 1.x (目前版本从1.1~1.9)与2.x。1.x与2.x从包的命名上可以看出来,1.x的类库中,包命名以:org.codehaus.jackson.xxx开头,而2.x类库中包命令:com.fastxml.jackson.xxx开头
Jackson Home Page:https://github.com/FasterXML/jackson
Jackson Wiki:http://wiki.fasterxml.com/JacksonHome
Jackson doc: https://github.com/FasterXML/jackson-docs
Jackson Download Page:http://wiki.fasterxml.com/JacksonDownload
准备工作
本文所有程序都基于JDK1.7,依赖jackon的三个核心类库:
jackson-core-2.5.3.jar
jackson-annotations-2.5.3.jar
jackson-databind-2.5.3.jar
Jackson处理Json
Jackson提供了三种可选的Json处理方法:流式API(Streaming API) 、树模型(Tree Model)、数据绑定(Data Binding)。从使用角度来看,比较一下这三种处理Json的方式的特性:
Streaming API:是效率最高的处理方式(开销低、读写速度快,但程序编写复杂度高)
Tree Model:是最灵活的处理方式
Data Binding:是最常用的处理方式
下面我们通过例子程序分别使用DataBinding,TreeModel,Streaming的方式来创建和解析Json字符串
1.DataBinding处理Json
- package com.jackson.json.databinding;
- public class Province {
- public String name;
- public int population;
- public String[] city;
- }
- package com.jackson.json.databinding;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- public class Country {
- // 注意:被序列化的bean的private属性字段需要创建getter方法或者属性字段应该为public
- private String country_id;
- private Date birthDate;
- private List<String> nation = new ArrayList<String>();
- private String[] lakes;
- private List<Province> provinces = new ArrayList<Province>();
- private Map<String, Integer> traffic = new HashMap<String, Integer>();
- public Country() {
- // TODO Auto-generated constructor stub
- }
- public Country(String countryId) {
- this.country_id = countryId;
- }
- public String getCountry_id() {
- return country_id;
- }
- public void setCountry_id(String country_id) {
- this.country_id = country_id;
- }
- public Date getBirthDate() {
- return birthDate;
- }
- public void setBirthDate(Date birthDate) {
- this.birthDate = birthDate;
- }
- public List<String> getNation() {
- return nation;
- }
- public void setNation(List<String> nation) {
- this.nation = nation;
- }
- public String[] getLakes() {
- return lakes;
- }
- public void setLakes(String[] lakes) {
- this.lakes = lakes;
- }
- public Integer get(String key) {
- return traffic.get(key);
- }
- public Map<String, Integer> getTraffic() {
- return traffic;
- }
- public void setTraffic(Map<String, Integer> traffic) {
- this.traffic = traffic;
- }
- public void addTraffic(String key, Integer value) {
- traffic.put(key, value);
- }
- public List<Province> getProvinces() {
- return provinces;
- }
- public void setProvinces(List<Province> provinces) {
- this.provinces = provinces;
- }
- @Override
- public String toString() {
- return "Country [country_id=" + country_id + ", birthDate=" + birthDate
- + ", nation=" + nation + ", lakes=" + Arrays.toString(lakes)
- + ", province=" + provinces + ", traffic=" + traffic + "]";
- }
- }
- package com.jackson.json.databinding;
- import java.io.File;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.List;
- import com.fasterxml.jackson.annotation.JsonInclude.Include;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.fasterxml.jackson.databind.SerializationFeature;
- public class JavaBeanSerializeToJson {
- public static void convert() throws Exception {
- // 使用ObjectMapper来转化对象为Json
- ObjectMapper mapper = new ObjectMapper();
- // 添加功能,让时间格式更具有可读性
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
- mapper.setDateFormat(dateFormat);
- Country country = new Country("China");
- country.setBirthDate(dateFormat.parse("1949-10-01"));
- country.setLakes(new String[] { "Qinghai Lake", "Poyang Lake",
- "Dongting Lake", "Taihu Lake" });
- List<String> nation = new ArrayList<String>();
- nation.add("Han");
- nation.add("Meng");
- nation.add("Hui");
- nation.add("WeiWuEr");
- nation.add("Zang");
- country.setNation(nation);
- Province province = new Province();
- province.name = "Shanxi";
- province.population = 37751200;
- Province province2 = new Province();
- province2.name = "ZheJiang";
- province2.population = 55080000;
- List<Province> provinces = new ArrayList<Province>();
- provinces.add(province);
- provinces.add(province2);
- country.setProvinces(provinces);
- country.addTraffic("Train(KM)", 112000);
- country.addTraffic("HighWay(KM)", 4240000);
- // 为了使JSON视觉上的可读性,增加一行如下代码,注意,在生产中不需要这样,因为这样会增大Json的内容
- mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
- // 配置mapper忽略空属性
- mapper.setSerializationInclusion(Include.NON_EMPTY);
- // 默认情况,Jackson使用Java属性字段名称作为 Json的属性名称,也可以使用Jackson annotations(注解)改变Json属性名称
- mapper.writeValue(new File("country.json"), country);
- }
- public static void main(String[] args) throws Exception {
- convert();
- }
- }
- {
- "country_id" : "China",
- "birthDate" : "1949-10-01",
- "nation" : [ "Han", "Meng", "Hui", "WeiWuEr", "Zang" ],
- "lakes" : [ "Qinghai Lake", "Poyang Lake", "Dongting Lake", "Taihu Lake" ],
- "provinces" : [ {
- "name" : "Shanxi",
- "population" : 37751200
- }, {
- "name" : "ZheJiang",
- "population" : 55080000
- } ],
- "traffic" : {
- "HighWay(KM)" : 4240000,
- "Train(KM)" : 112000
- }
- }
- package com.jackson.json.databinding;
- import java.io.File;
- import java.io.IOException;
- import java.text.SimpleDateFormat;
- import java.util.Iterator;
- import java.util.List;
- import com.fasterxml.jackson.core.JsonParseException;
- import com.fasterxml.jackson.databind.DeserializationFeature;
- import com.fasterxml.jackson.databind.JsonMappingException;
- import com.fasterxml.jackson.databind.ObjectMapper;
- /**
- * 将Json字符串反序列化为Java对象
- */
- public class JsonDeserializeToJava {
- public static void main(String[] args) throws Exception {
- //ObjectMapper类用序列化与反序列化映射器
- ObjectMapper mapper = new ObjectMapper();
- File json = new File("country.json");
- //当反序列化json时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,
- //因为,例如json里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略
- mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
- //从json映射到java对象,得到country对象后就可以遍历查找,下面遍历部分内容,能说明问题就可以了
- Country country = mapper.readValue(json, Country.class);
- System.out.println("country_id:"+country.getCountry_id());
- //设置时间格式,便于阅读
- SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
- String birthDate = dateformat.format(country.getBirthDate());
- System.out.println("birthDate:"+birthDate);
- List<Province> provinces = country.getProvinces();
- for (Province province : provinces) {
- System.out.println("province:"+province.name + "\n" + "population:"+province.population);
- }
- }
- }
- country_id:China
- birthDate:1949-10-01
- province:Shanxi
- population:37751200
- province:ZheJiang
- population:55080000
2.Tree Model处理Json
(1)tree model生成json:
- package com.jackson.json.treemodel;
- import java.io.File;
- import java.io.FileWriter;
- import com.fasterxml.jackson.core.JsonFactory;
- import com.fasterxml.jackson.core.JsonGenerator;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.fasterxml.jackson.databind.SerializationFeature;
- import com.fasterxml.jackson.databind.node.ArrayNode;
- import com.fasterxml.jackson.databind.node.JsonNodeFactory;
- import com.fasterxml.jackson.databind.node.ObjectNode;
- public class SerializationExampleTreeModel {
- public static void main(String[] args) throws Exception {
- //创建一个节点工厂,为我们提供所有节点
- JsonNodeFactory factory = new JsonNodeFactory(false);
- //创建一个json factory来写tree modle为json
- JsonFactory jsonFactory = new JsonFactory();
- //创建一个json生成器
- JsonGenerator generator = jsonFactory.createGenerator(new FileWriter(new File("country2.json")));
- //注意,默认情况下对象映射器不会指定根节点,下面设根节点为country
- ObjectMapper mapper = new ObjectMapper();
- ObjectNode country = factory.objectNode();
- country.put("country_id", "China");
- country.put("birthDate", "1949-10-01");
- //在Java中,List和Array转化为json后对应的格式符号都是"obj:[]"
- ArrayNode nation = factory.arrayNode();
- nation.add("Han").add("Meng").add("Hui").add("WeiWuEr").add("Zang");
- country.set("nation", nation);
- ArrayNode lakes = factory.arrayNode();
- lakes.add("QingHai Lake").add("Poyang Lake").add("Dongting Lake").add("Taihu Lake");
- country.set("lakes", lakes);
- ArrayNode provinces = factory.arrayNode();
- ObjectNode province = factory.objectNode();
- ObjectNode province2 = factory.objectNode();
- province.put("name","Shanxi");
- province.put("population", 37751200);
- province2.put("name","ZheJiang");
- province2.put("population", 55080000);
- provinces.add(province).add(province2);
- country.set("provinces", provinces);
- ObjectNode traffic = factory.objectNode();
- traffic.put("HighWay(KM)", 4240000);
- traffic.put("Train(KM)", 112000);
- country.set("traffic", traffic);
- mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
- mapper.writeTree(generator, country);
- }
- }
程序运行生成country2.json,内容如下:
- {"country_id":"China","birthDate":"1949-10-01","nation":["Han","Meng","Hui","WeiWuEr","Zang"],"lakes":["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"],"provinces":[{"name":"Shanxi","population":37751200},{"name":"ZheJiang","population":55080000}],"traffic":{"HighWay(KM)":4240000,"Train(KM)":112000}}
(2) json字符串反序列化为tree mode
DeserializationExampleTreeModel1.java,请注意观察程序中不同的JsonNode的类型变化
- package com.jackson.json.treemodel;
- import java.io.File;
- import java.util.Iterator;
- import com.fasterxml.jackson.databind.JsonNode;
- import com.fasterxml.jackson.databind.ObjectMapper;
- public class DeserializationExampleTreeModel1 {
- public static void main(String[] args) throws Exception {
- ObjectMapper mapper = new ObjectMapper();
- // Jackson提供一个树节点被称为"JsonNode",ObjectMapper提供方法来读json作为树的JsonNode根节点
- JsonNode node = mapper.readTree(new File("country2.json"));
- // 看看根节点的类型
- System.out.println("node JsonNodeType:"+node.getNodeType());
- // 是不是一个容器
- System.out.println("node is container Node ? "+node.isContainerNode());
- // 得到所有node节点的子节点名称
- System.out.println("---------得到所有node节点的子节点名称-------------------------");
- Iterator<String> fieldNames = node.fieldNames();
- while (fieldNames.hasNext()) {
- String fieldName = fieldNames.next();
- System.out.print(fieldName+" ");
- }
- System.out.println("\n-----------------------------------------------------");
- // as.Text的作用是有值返回值,无值返回空字符串
- JsonNode country_id = node.get("country_id");
- System.out.println("country_id:"+country_id.asText() + " JsonNodeType:"+country_id.getNodeType());
- JsonNode birthDate = node.get("birthDate");
- System.out.println("birthDate:"+birthDate.asText()+" JsonNodeType:"+birthDate.getNodeType());
- JsonNode nation = node.get("nation");
- System.out.println("nation:"+ nation+ " JsonNodeType:"+nation.getNodeType());
- JsonNode lakes = node.get("lakes");
- System.out.println("lakes:"+lakes+" JsonNodeType:"+lakes.getNodeType());
- JsonNode provinces = node.get("provinces");
- System.out.println("provinces JsonNodeType:"+provinces.getNodeType());
- boolean flag = true;
- for (JsonNode provinceElements : provinces) {
- //为了避免provinceElements多次打印,用flag控制打印,能体现provinceElements的JsonNodeType就可以了
- if(flag){
- System.out.println("provinceElements JsonNodeType:"+provinceElements.getNodeType());
- System.out.println("provinceElements is container node? "+provinceElements.isContainerNode());
- flag = false;
- }
- Iterator<String> provinceElementFields = provinceElements.fieldNames();
- while (provinceElementFields.hasNext()) {
- String fieldName = (String) provinceElementFields.next();
- String province;
- if ("population".equals(fieldName)) {
- province = fieldName + ":" + provinceElements.get(fieldName).asInt();
- }else{
- province = fieldName + ":" + provinceElements.get(fieldName).asText();
- }
- System.out.println(province);
- }
- }
- }
- }
程序运行后打印结果如下:
- node JsonNodeType:OBJECT
- node is container Node ? true
- ---------得到所有node节点的子节点名称-------------------------
- country_id birthDate nation lakes provinces traffic
- -----------------------------------------------------
- country_id:China JsonNodeType:STRING
- birthDate:1949-10-01 JsonNodeType:STRING
- nation:["Han","Meng","Hui","WeiWuEr","Zang"] JsonNodeType:ARRAY
- lakes:["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"] JsonNodeType:ARRAY
- provinces JsonNodeType:ARRAY
- provinceElements JsonNodeType:OBJECT
- provinceElements is container node? true
- name:Shanxi
- population:37751200
- name:ZheJiang
- population:55080000
在来看一下DeserializationExampleTreeModel2.java,本例中使用JsonNode.path的方法,path方法类似于DeserializationExampleTreeModel1.java中使用的get方法,
但当node不存在时,get方法返回null,而path返回MISSING类型的JsonNode
- package com.jackson.json.treemodel;
- import java.io.File;
- import java.io.IOException;
- import java.util.Iterator;
- import com.fasterxml.jackson.core.JsonProcessingException;
- import com.fasterxml.jackson.databind.JsonNode;
- import com.fasterxml.jackson.databind.ObjectMapper;
- public class DeserializationExampleTreeModle2 {
- public static void main(String[] args) throws JsonProcessingException, IOException{
- ObjectMapper mapper = new ObjectMapper();
- JsonNode node = mapper.readTree(new File("country2.json"));
- //path方法获取JsonNode时,当对象不存在时,返回MISSING类型的JsonNode
- JsonNode missingNode = node.path("test");
- if(missingNode.isMissingNode()){
- System.out.println("JsonNodeType : " + missingNode.getNodeType());
- }
- System.out.println("country_id:"+node.path("country_id").asText());
- JsonNode provinces = node.path("provinces");
- for (JsonNode provinceElements : provinces) {
- Iterator<String> provincesFields = provinceElements.fieldNames();
- while (provincesFields.hasNext()) {
- String fieldName = (String) provincesFields.next();
- String province;
- if("name".equals(fieldName)){
- province = fieldName +":"+ provinceElements.path(fieldName).asText();
- }else{
- province = fieldName +":"+ provinceElements.path(fieldName).asInt();
- }
- System.out.println(province);
- }
- }
- }
- }
程序运行打印结果:
- JsonNodeType : MISSING
- country_id:China
- name:Shanxi
- population:37751200
- name:ZheJiang
- population:55080000
3.Stream处理Json
- package com.jackson.json.streaming;
- import java.io.File;
- import java.io.FileWriter;
- import java.io.Exception;
- import com.fasterxml.jackson.core.JsonFactory;
- import com.fasterxml.jackson.core.JsonGenerator;
- public class StreamGeneratorJson {
- public static void main(String[] args) throws Exception {
- JsonFactory factory = new JsonFactory();
- //从JsonFactory创建一个JsonGenerator生成器的实例
- JsonGenerator generator = factory.createGenerator(new FileWriter(new File("country3.json")));
- generator.writeStartObject();
- generator.writeFieldName("country_id");
- generator.writeString("China");
- generator.writeFieldName("provinces");
- generator.writeStartArray();
- generator.writeStartObject();
- generator.writeStringField("name", "Shanxi");
- generator.writeNumberField("population", 33750000);
- generator.writeEndObject();
- generator.writeEndArray();
- generator.writeEndObject();
- generator.close();
- }
- }
- {"country_id":"China","provinces":[{"name":"Shanxi","population":33750000}]}
现在adgcountry3.json,我们用Streaming API的方式来解析上面的Json,并查找json中population的值。
- package com.jackson.json.streaming;
- import java.io.File;
- import java.io.IOException;
- import com.fasterxml.jackson.core.JsonFactory;
- import com.fasterxml.jackson.core.JsonParseException;
- import com.fasterxml.jackson.core.JsonParser;
- import com.fasterxml.jackson.core.JsonToken;
- /*Jackson API提供了token对每个Json对象,例如,Json开始符号“{”是token指向的第一个解析的对象,
- key:value键值对是另一个单独的对象。这个API很强大,但也需要编写大量代码。不推荐使用,平时更多的是使用DataBinding和TreeModel来处理json
- */
- public class StreamParserJson {
- public static void main(String[] args) throws JsonParseException,
- IOException {
- JsonFactory factory = new JsonFactory();
- // 从JsonFactory创建JsonParser解析器的实例
- JsonParser parser = factory.createParser(new File("country3.json"));
- while (!parser.isClosed()) {
- // 得到一个token,第一次遍历时,token指向json文件中第一个符号"{"
- JsonToken token = parser.nextToken();
- if (token == null) {
- break;
- }
- // 我们只查找 country3.json中的"population"字段的值,能体现解析的流程就可以了
- // 当key是provinces时,我们进入provinces,查找population
- if (JsonToken.FIELD_NAME.equals(token)
- && "provinces".equals(parser.getCurrentName())) {
- token = parser.nextToken();
- if (!JsonToken.START_ARRAY.equals(token)) {
- break;
- }
- // 此时,token指向的应该是"{"
- token = parser.nextToken();
- if (!JsonToken.START_OBJECT.equals(token)) {
- break;
- }
- while (true) {
- token = parser.nextToken();
- if (token == null) {
- break;
- }
- if (JsonToken.FIELD_NAME.equals(token)
- && "population".equals(parser.getCurrentName())) {
- token = parser.nextToken();
- System.out.println(parser.getCurrentName() + " : "
- + parser.getIntValue());
- }
- }
- }
- }
- }
- }
- population : 33750000
总结
Jackson-Java bean到JSON字符串:大写变量在JSON中转换为小写
我正在使用ObjectMapper的writeValueAsString方法将Java bean转换为JSON字符串,其中Java
bean中的大写变量被更改为JSON字符串中的小写字母。实施了Jackson 2.7.4版本。菜豆样品-
public class BaseBean {private static final long serialVersionUID = 3947489072259877540L;private int _iXId;private String _sPNR;private ArrayList _alMinPriced = new ArrayList<TermBean>();public int getXId() { return _iXId;}public void setXId(int id) { _iXId = id;}public String getPNRNumber() { return _sPNR;}public void setPNRNumber(String _spnr) { _sPNR = _spnr;}public ArrayList getMinPriced() { return _alMinPriced;}public void setMinPriced(ArrayList minPriced) { _alMinPriced = minPriced;}public void setMinPriced(TermBean bnTerm) { _alMinPriced.add(bnTerm);}
}
之前,我们使用net.sf.json.JSON和JSONSerializer将Java bean转换为JSON。生成的JSON字符串与我们使用的Java
bean具有相似的命名。由于性能问题,我想对此进行更改并实施Jackson。
限制:我们无法更改Java
bean的命名约定,因为这些bean来自较旧的项目,并且几乎没有范围来更改bean中的变量名,甚至在每个bean中添加json属性。
我已经尝试了下面的代码,但是没有用
ObjectMapper mapper = new ObjectMapper();mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
另外,我尝试了自定义的PropertyNamingStrategy,但对此还不清楚。
编辑:
net.sf.json.JSON 生成了上述Bean的JSON字符串,如下所述:
{"XId":11,"PNRNumber":"123456789","minPriced":[{"name":"JSON"},{"name":"simple"}]}
Jackson 为上述bean生成了JSON字符串,如下所述:
{"xid":11,"pnrnumber":"123456789","minPriced":[{"name":"JSON"},{"name":"Jackson"}]}
如您所见,在jackson中,“ XId”转换为“ xid”,在jackson中,“ PNRNumber”转换为“ pnrnumber”。
Jackson中是否有任何可用的配置更改来避免此类修改。或如何处理这种情况。
答案1
小编典典使用了以下罐子:
- 杰克逊核心2.7.4.jar
- 杰克逊注释2.7.4.jar
- jackson-databind-2.7.4.jar
步骤1:请按以下方式编写以下Mixin:
import java.util.ArrayList;import com.fasterxml.jackson.annotation.JsonProperty;public abstract class MixIn { @JsonProperty("PNRNumber") abstract String getPNRNumber(); @JsonProperty("XId") abstract int getXId(); @JsonProperty("minPriced") abstract ArrayList getMinPriced();}
步骤2:请按照以下步骤编写模块:
import com.fasterxml.jackson.databind.module.SimpleModule;public class MyModule extends SimpleModule{ public MyModule() { super("ModuleName"); } @Override public void setupModule(SetupContext context){ context.setMixInAnnotations(BaseBean.class, MixIn.class); }}
步骤3:现在是时候获取json String了,如下所示:
TermBean bean1=new TermBean("JSON");TermBean bean2=new TermBean("simple");ArrayList list=new ArrayList(); list.add(bean1); list.add(bean2);BaseBean bb=new BaseBean(); bb.setXId(11); bb.setPNRNumber("123456789"); bb.setMinPriced(list);ObjectMapper mapper = new ObjectMapper();Module myModule = new MyModule();mapper.registerModule(myModule); String jsonInString = mapper.writeValueAsString(bb); System.out.printf( "JSON: %s", jsonInString );
输出:
JSON:{“ XId”:11,“ PNRNumber”:“ 123456789”,“ minPriced”:[{“ name”:“ JSON”},{“
name”:“ simple”}]}}
希望这可以帮助。
Jackson中json格式的字符串与对象的互相转换方式
json格式的字符串与对象的互相转换
Jackson 简介
Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json字符串和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。
jackson特点
- 容易使用 - jackson API提供了一个高层次外观,以简化常用的用例。
- 无需创建映射 - API提供了默认的映射大部分对象序列化。
- 性能高 - 快速,低内存占用,适合大型对象图表或系统。
- 干净的JSON - jackson创建一个干净和紧凑的JSON结果,这是让人很容易阅读。
- 不依赖 - 库不需要任何其他的库,除了JDK。
- 开源代码 - jackson是开源的,可以免费使用。
json格式的字符串与对象的转换
使用Jackson必须要在项目导入对应的jar包。
Book.java文件
package cn.hestyle.bean; public class Book { private String id; private String name; private double price; private int pnum; private String category; private String description; public Book() { super(); // TODO Auto-generated constructor stub } public Book(String id, String name, double price, int pnum, String category, String description) { super(); this.id = id; this.name = name; this.price = price; this.pnum = pnum; this.category = category; this.description = description; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPnum() { return pnum; } public void setPnum(int pnum) { this.pnum = pnum; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public String toString() { return "Book [id=" + id + ", name=" + name + ", price=" + price + ", pnum=" + pnum + ", category=" + category + ", description=" + description + "]"; } }
package cn.hestyle.utils; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import cn.hestyle.bean.Book; public class JacksonDemo01 { public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException { ObjectMapper objectMapper = new ObjectMapper(); //将对象转换为json格式的字符串 Book book = new Book("1001", "Java入门到入土", 99.9, 100, "编程开发", "你懂得!"); String bookJsonStr = objectMapper.writeValueAsString(book); System.out.println(bookJsonStr); //将集合、数组对象转换为json格式的字符串 List<Book> bookList = new ArrayList<Book>(); bookList.add(new Book("1001", "Java入门到入土", 99.9, 100, "编程开发", "你懂得!")); bookList.add(new Book("1002", "Python入门到入土", 89.9, 100, "编程开发", "你懂得!")); bookList.add(new Book("1003", "C++入门到入土", 89.9, 200, "编程开发", "你懂得!")); String bookListJsonStr = objectMapper.writeValueAsString(bookList); System.out.println(bookListJsonStr); //将json格式的字符串转化为对象 //字符串中含有双引号,需要使用反斜杠转义 String bookString = "{\"id\":\"1001\",\"name\":\"Java入门到入土\",\"price\":99.9,\"pnum\":100}"; //Book必须有无参的构造方法 Book book2 = objectMapper.readValue(bookString, Book.class); System.out.println(book2); } }
控制台输出:
Jackson进行json转对象,对象转json总结
在前后端分离的项目中,后端经常涉及到json与对象互转的场景。阿里巴巴的Fastjson是好用,但是,因为技术领导的原因(可能因为fastjson1的各种问题很多吧),不让用,所以就需要选择其他技术栈。当前比较常用的是SpringBoot自带的Jackson或者谷歌的Gson。
下面,做一下使用Jackson的总结。
JavaBean准备
1.Company,公司
@Data @NoArgsConstructor @AllArgsConstructor public class Company { private String companyName; private List<WebSite> webSites; }
2.WebSite,站点
@Data @NoArgsConstructor @AllArgsConstructor public class WebSite { private String webSiteName; private List<User> users; }
3.User,用户
@Data @NoArgsConstructor @AllArgsConstructor public class User { private String userId; private String username; private String password; }
json字符串和对象互转
对象转json字符串
不管你是什么结构的对象,想转json,直接objectMapper.writeValueAsString()搞定。
/** * 序列化:对象转json字符串,包含多个数组 * */ @Test public void testObject2Json2() { User user2 = new User("1","上海辟谣专属队","职业辟谣,不信谣,不传谣,呵呵"); List<User> users = new ArrayList<>(); users.add(user2); WebSite webSite = new WebSite(); webSite.setWebSiteName("xxxxxx.com"); webSite.setUsers(users); List<WebSite> webSites = new ArrayList<>(); webSites.add(webSite); Company company = new Company(); company.setCompanyName("yyyyyy"); company.setWebSites(webSites); ObjectMapper objectMapper = new ObjectMapper(); try { String jsonString = objectMapper.writeValueAsString(company); System.out.println(jsonString); } catch (JsonProcessingException e) { log.error("error: ", e); } }
输出:
{"companyName":"yyyyyy","webSites":[{"webSiteName":"xxxxxx.com","users":[{"userId":"1","username":"上海辟谣专属队","password":"职业辟谣,不信谣,不传谣,呵呵"}]}]}
json字符串转对象
注意:这种情形是json对象字符串,不能是json数组字符串,后面会说到。
@Test public void testJson2Object() { String json = "{\"companyName\":\"yyyyyy\",\"webSites\":[" + "{\"webSiteName\":\"xxxxxx.com\",\"users\":[{\"userId\":\"1\",\"username\":\"上海辟谣专属队\",\"password\":\"职业辟谣,不信谣,不传谣,呵呵\"}]}" + "]}"; ObjectMapper objectMapper = new ObjectMapper(); try { Company company = objectMapper.readValue(json, Company.class); System.out.println(company.getWebSites().get(0).getUsers().get(0).getUsername()); } catch (JsonProcessingException e) { log.error("error: ", e); } }
输出:
上海辟谣专属队
json数组字符串和数组(集合)对象互转
有个大坑
数组对象转json数组字符串
/** * 序列化:数组对象转json数组类型的字符串 * */ @Test public void testObjectArray2JsonArrayString() { User user1 = new User("1","上海带刀沪卫","带刀大佬"); User user2 = new User("1","上海辟谣专属队","职业辟谣,不信谣,不传谣,呵呵"); List<User> users = new ArrayList<>(); users.add(user1); users.add(user2); ObjectMapper objectMapper = new ObjectMapper(); try { String json = objectMapper.writeValueAsString(users); System.out.println(json); } catch (JsonProcessingException e) { log.error("error: ", e); } }
输出:
[{"userId":"1","username":"上海带刀沪卫","password":"带刀大佬"},{"userId":"1","username":"上海辟谣专属队","password":"职业辟谣,不信谣,不传谣,呵呵"}]
json数组字符串转数组对象
先演示一下错误的写法,先演示一下错误的写法,先演示一下错误的写法,重要的事情说三遍!
/** * 反序列化:数组类型的json字符串转对象数组 * */ @Test public void testJsonArrayString2ObjectArray() { String json = "[" + "{\"userId\":\"1\",\"username\":\"上海带刀沪卫\",\"password\":\"带刀大佬\"}" + ",{\"userId\":\"1\",\"username\":\"上海辟谣专属队\",\"password\":\"职业辟谣,不信谣,不传谣,呵呵\"}" + "]"; ObjectMapper objectMapper = new ObjectMapper(); try { //错误写法 List<User> list = objectMapper.readValue(json, List.class); list.forEach(user -> { System.out.println(user.getUsername()); }); } catch (JsonProcessingException e) { log.error("error: ", e); } }
输出异常:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.xywei.springboot.springtestdemo.entity.Userat java.util.ArrayList.forEach(ArrayList.java:1259)
at com.xywei.springboot.springtestdemo.junit.TestUseJackson.testJsonArrayString2ObjectArray(TestUseJackson.java:160)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at#省略大段……
Process finished with exit code -1
因为实际转成了map类型,所以使用List方式取值是错的!
正确做法:
/** * 反序列化:数组类型的json字符串转对象数组 * */ @Test public void testJsonArrayString2ObjectArray() { String json = "[" + "{\"userId\":\"1\",\"username\":\"上海带刀沪卫\",\"password\":\"带刀大佬\"}" + ",{\"userId\":\"1\",\"username\":\"上海辟谣专属队\",\"password\":\"职业辟谣,不信谣,不传谣,呵呵\"}" + "]"; ObjectMapper objectMapper = new ObjectMapper(); try { TypeReference<List<User>> typeReference = new TypeReference<List<User>>() { }; List<User> list = objectMapper.readValue(json, typeReference); list.forEach(user -> { System.out.println(user.getUsername()); }); } catch (JsonProcessingException e) { log.error("error: ", e); } }
最终输出:
上海带刀沪卫
上海辟谣专属队
同时,对多层嵌套的数组也适用:
@Test public void testJsonArrayString2ObjectArray2() { String json = "[" + "{" + "\"companyName\":\"yyyyyy\",\"webSites\":[" + "{\"webSiteName\":\"xxxxxx.com\",\"users\":[" + "{\"userId\":\"1\",\"username\":\"上海辟谣专属队\",\"password\":\"职业辟谣,不信谣,不传谣,呵呵\"}" + "]" + "}" + "]" + "}" + "]"; ObjectMapper objectMapper = new ObjectMapper(); try { TypeReference<List<Company>> typeReference = new TypeReference<List<Company>>() { }; List<Company> list = objectMapper.readValue(json, typeReference); list.forEach(company -> { System.out.println(company.getWebSites().get(0).getUsers().get(0).getUsername()); }); } catch (JsonProcessingException e) { log.error("error: ", e); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
- mysql5.6 解析JSON字符串方式(支持复杂的嵌套格式)
- 使用JSON.toJSONString格式化成json字符串时保留null属性
- Mysql怎么存储json格式数据详解
- json文件书写格式详解
- Json格式详解
- JSON 格式的弊端与解决方法(真实示例)
今天关于在Jackson中读取嵌入式对象和jackson 嵌套对象的分享就到这里,希望大家有所收获,若想了解更多关于c#中中读取嵌入和使用资源文件的方法、jackson java对象和json对象的互相转换、Jackson-Java bean到JSON字符串:大写变量在JSON中转换为小写、Jackson中json格式的字符串与对象的互相转换方式等相关知识,可以在本站进行查询。
本文标签: