各个类型和Json类型的相互转换

ObjectMapper类(com.fasterxml.jackson.databind.ObjectMapper)是Jackson的主要类,它可以帮助我们快速的进行各个类型和Json类型的相互转换。

对应maven:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-core</artifactId>
     <version>2.12.2</version>
     <scope>runtime</scope>
 </dependency>
 <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-annotations</artifactId>
     <version>2.12.2</version>
     <scope>runtime</scope>
 </dependency>
 <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.12.2</version>
     <scope>runtime</scope>
 </dependency>

1、ObjectMapper的常用配置

private static final ObjectMapper mapper;
 
public static ObjectMapper getObjectMapper(){
    return this.mapper;
}
 
static{
    //创建ObjectMapper对象
    mapper = new ObjectMapper()
 
    //configure方法 配置一些需要的参数
    // 转换为格式化的json 显示出来的格式美化
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
 
   //序列化的时候序列对象的那些属性  
   //JsonInclude.Include.NON_DEFAULT 属性为默认值不序列化 
   //JsonInclude.Include.ALWAYS      所有属性
   //JsonInclude.Include.NON_EMPTY   属性为 空(“”) 或者为 NULL 都不序列化 
   //JsonInclude.Include.NON_NULL    属性为NULL 不序列化
   mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);  
 
   
    //反序列化时,遇到未知属性会不会报错 
    //true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
    //如果是空对象的时候,不抛异常  
    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);  
 
    // 忽略 transient 修饰的属性
    mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);
 
    //修改序列化后日期格式
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);  
    mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
 
   //处理不同的时区偏移格式
   mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
   mapper.regi sterModule(new JavaTimeModule());
 
}

2、ObjectMapper的常用方法

1)json字符串转对象

ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"name\":\"Hyl\", \"age\":20}";
 
//将字符串转换为对象
Student student = mapper.readValue(jsonString, Student.class);
System.out.println(student);
 
//将对象转换为json字符串
jsonString = mapper.writeValueAsString(student);
System.out.println(jsonString);
 

结果:

Student [ name: Hyl, age: 20 ]
 
{
  "name" : "Hyl",
  "age" : 20
}

2)数组和对象之间转换

//对象转为byte数组
byte[] byteArr = mapper.writeValueAsBytes(student);
System.out.println(byteArr);
 
 
//byte数组转为对象
Student student= mapper.readValue(byteArr, Student.class);
System.out.println(student);
 

结果:

[B@3327bd23
 
Student [ name: Hyl, age: 20 ]

3)集合和json字符串之间转换

List<Student> studentList= new ArrayList<>();
studentList.add(new Student("hyl1" ,20 , new Date()));
studentList.add(new Student("hyl2" ,21 , new Date()));
studentList.add(new Student("hyl3" ,22 , new Date()));
studentList.add(new Student("hyl4" ,23 , new Date()));
 
String jsonStr = mapper.writeValueAsString(studentList);
System.out.println(jsonStr);
        
List<Student> studentList2 = mapper.readValue(jsonStr, List.class);
System.out.println("字符串转集合:" + studentList2 );

结果:

[ {
  "name" : "hyl1",
  "age" : 20,
  "sendTime" : 1525164212803
}, {
  "name" : "hyl2",
  "age" : 21,
  "sendTime" : 1525164212803
}, {
  "name" : "hyl3",
  "age" : 22,
  "sendTime" : 1525164212803
}, {
  "name" : "hyl4",
  "age" : 23,
  "sendTime" : 1525164212803
} ]
[{name=hyl1, age=20, sendTime=1525164212803}, {name=hyl2, age=21, sendTime=1525164212803}, {name=hyl3, age=22, sendTime=1525164212803}, {name=hyl4, age=23, sendTime=1525164212803}]

4)map和json字符串之间转换

Map<String, Object> testMap = new HashMap<>();
testMap.put("name", "22");
testMap.put("age", 20);
testMap.put("date", new Date());
testMap.put("student", new Student("hyl", 20, new Date()));
 
 
String jsonStr = mapper.writeValueAsString(testMap);
System.out.println(jsonStr);
Map<String, Object> testMapDes = mapper.readValue(jsonStr, Map.class);
System.out.println(testMapDes);

结果:

{
  "date" : 1525164212803,
  "name" : "22",
  "student" : {
    "name" : "hyl",
    "age" : 20,
    "sendTime" : 1525164212803,
    "intList" : null
  },
  "age" : 20
}
{date=1525164212803, name=22, student={name=hyl, age=20, sendTime=1525164212803, intList=null}, age=20}

5)日期转json字符串

// 修改时间格式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
Student student = new Student ("hyl",21, new Date());
student.setIntList(Arrays.asList(1, 2, 3));
 
String jsonStr = mapper.writeValueAsString(student);
System.out.println(jsonStr);
 

结果:

{
  "name" : "hyl",
  "age" : 21,
  "sendTime" : "2020-07-23 13:14:36",
  "intList" : [ 1, 2, 3 ]
}

6)readTree()方法

//此方法更灵活,可以只将用户感兴趣的Json串信息值提取出来。主要利用ObjectMapper提供的readTree和Jackson提供的JsonNode类来实现

String test="{"results":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
 
//此Json串比较复杂,包含了嵌套数组的形式,具有通用性。
 
//2.2.2.2实现反序列化
JsonNode node= objectMapper.readTree(test);      //将Json串以树状结构读入内存
 
JsonNode contents=node.get("results");//得到results这个节点下的信息
 
for(int i=0;i<contents.size();i++)  //遍历results下的信息,size()函数可以得节点所包含的的信息的个数,类似于数组的长度
 
{
 
System.out.println(contents.get(i).get("objectID").getIntValue()); //读取节点下的某个子节点的值
 
JsonNode geoNumber=contents.get(i).get("geoPoints");
 
for(int j=0;j<geoNumber.size();j++)     //循环遍历子节点下的信息
 
{
 
System.out.println(geoNumber.get(j).get("x").getDoubleValue()+"  "+geoNumber.get(j).get("y").getDoubleValue());
 
}
 
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JSONJavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。在Python中,我们可以使用`json`模块来进行JSON数据的序列化和反序列化。 #### JSON序列化 将Python对象转换JSON格式的字符串,可以使用`json.dumps()`函数。例如,将一个字典对象转换JSON字符串: ```python import json data = {"name": "Tom", "age": 18, "is_student": True} json_str = json.dumps(data) print(json_str) ``` 输出结果为: ``` {"name": "Tom", "age": 18, "is_student": true} ``` #### JSON反序列化 将JSON格式的字符串转换成Python对象,可以使用`json.loads()`函数。例如,将一个JSON字符串转换成字典对象: ```python import json json_str = '{"name": "Tom", "age": 18, "is_student": true}' data = json.loads(json_str) print(data) ``` 输出结果为: ``` {'name': 'Tom', 'age': 18, 'is_student': True} ``` #### JSON文件的读写 我们也可以使用`json.dump()`和`json.load()`函数来对JSON文件进行读写操作。 将Python对象写入JSON文件: ```python import json data = {"name": "Tom", "age": 18, "is_student": True} with open("data.json", "w") as f: json.dump(data, f) ``` 从JSON文件中读取Python对象: ```python import json with open("data.json", "r") as f: data = json.load(f) print(data) ``` 以上就是JSON序列化和反序列化的基础用法。需要注意的是,JSON格式的字符串必须使用双引号,而不能使用单引号。 ### 回答2: JSON序列化指将数据结构或对象化为JSON字符串的过程。在序列化过程中,Python的数据结构或对象将化为符合JSON规范的字符串形式,以便于传输、存储或与其他编程语言进行数据交互。 JSON反序列化则是将JSON字符串化为Python的数据结构或对象的过程。通过反序列化,我们可以将JSON格式的数据重新化为Python中对应的数据类型,以便于在程序中操作和处理这些数据。 在Python中,我们可以使用内置的json模块来实现JSON序列化和反序列化。该模块提供了一些方法,如dumps()用于将Python对象化为JSON字符串,loads()用于将JSON字符串化为Python对象。 在进行JSON序列化时,我们可以通过指定参数来控制序列化的方式。例如,可以使用indent参数来指定缩进的空格数,使得生成的JSON字符串更易读;可以使用separators参数来指定各个部分之间的分隔符;可以使用default参数来指定一个函数,用于将非序列化类型的数据进行处理。 在进行JSON反序列化时,我们可以使用load()方法来从文件中读取JSON字符串,并将其化为Python对象。同样地,我们也可以使用loads()方法从字符串中读取JSON字符串,并将其化为Python对象。 总之,JSON序列化和反序列化在数据交互和存储中起着重要的作用,通过将数据化为JSON字符串,我们可以轻松地在不同的平台和编程语言之间互相传递数据。而通过JSON反序列化,我们可以将接收到的JSON字符串重新化为可操作的数据类型,进而进行后续的数据处理。 ### 回答3: JSON序列化是将数据对象转换JSON格式的字符串的过程。在序列化过程中,数据对象的属性和值会按照固定的规则(如键值对)转换字符串中的属性和值。JSON序列化通常用于将对象发送给网络或保存到磁盘等操作。 JSON反序列化是将JSON格式的字符串转换为对应的数据对象的过程。在反序列化过程中,字符串中的属性和值会被解析为数据对象的属性和值,从而还原对象的状态。 JSON序列化和反序列化在许多场景中广泛应用。首先,它们可用于数据的持久化,将数据对象保存到磁盘或数据库中。其次,它们可用于网络通信,将数据对象作为JSON字符串发送给服务器或其他客户端进行处理。此外,JSON序列化和反序列化还可以用于在不同的编程语言之间交换数据,因为JSON是一种通用的数据交换格式。 在实际应用中,通常使用JSON序列化库来实现序列化和反序列化的过程。这些库提供了一组API,可以方便地将数据对象转换JSON字符串或将JSON字符串转换为数据对象。常见的JSON序列化库包括Java中的Jackson和Gson,Python中的json模块以及C#中的Newtonsoft.Json等。 总之,JSON序列化和反序列化是一种将数据对象转换JSON格式的字符串和将JSON字符串转换为数据对象的过程,通过这种方式可以方便地进行数据持久化、网络通信和跨语言数据交换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值