【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

一步一步指南:利用 JSON 将 Java 实体对象反序列化为对象 (一步步指导)

用户投稿2024-04-10热门资讯19

简介

反序列化是指将 JSON 数据转换回 Java 实体对象的过程。本指南将逐步指导您完成使用 JSON 将 Java 实体对象反序列化的过程。

先决条件

Java 开发环境JSON 解析库,如 Jackson、Gson 或 org.json

步骤

1. 创建 Java 实体对象

创建一个 Java 实体对象,它将用于表示 JSON 数据。该对象应具有与 JSON 数据结构相匹配的字段。例如:```javapublic class Person {private String name;private int age;}```

2. 创建 JSON 数据

接下来,创建包含要反序列化的 JSON 数据的 String。该 JSON 数据应遵循 JSON 语法,并与您在第 1 步创建的 Java 实体对象匹配。例如:```json{"name": "John Doe","age": 30}```

3. 选择 JSON 解析库

有多种 JSON 解析库可供选择,如 Jackson、Gson 或 org.json。选择一个适合您需求和偏好的库。

4. 解析 JSON 数据

使用您选择的 JSON 解析库解析 JSON 数据。该解析库将创建 JSON 数据的 Java 对象表示形式。Jackson 示例:```javaObjectMapper mapper = new ObjectMapper();Person person = mapper.readValue(json, Person.class);```Gson 示例:```javaGson gson = new Gson();Person person = gson.fromJson(json, Person.class);```org.json 示例:```javaJSONObject jsonObject = new JSONObject(json);String name = jsonObject.getString("name");int age = jsonObject.getInt("age");Person person = new Person(name, age);```

5. 使用反序列化对象

现在您已经将 JSON 数据反序列化为 Java 实体对象,您可以使用该对象来访问和操作数据。

示例

以下是一个完整的示例,展示了如何使用 Jackson 库将 JSON 数据反序列化为 Java 实体对象: java import com.fasterxml.jackson.databind.ObjectMapper;public class Main {public static void main(String[] args) throws IOException {// 创建 JSON 数据String json = "{ \"name\": \"John Doe\", \"age\": 30 }";// 创建 Jackson 对象映射器ObjectMapper mapper = new ObjectMapper();// 反序列化 JSON 数据Person person = mapper.readValue(json, Person.class);// 使用反序列化对象System.out.println("姓名:" + person.getName());System.out.println("年龄:" + person.getAge());} }

最佳实践

使用与您要解析的 JSON 数据结构匹配的实体类。考虑使用 JSON Schema 验证器来确保 JSON 数据的有效性。使用 JSON 解析库的特性,如对象映射和反序列化器,以简化反序列化过程。仔细处理异常,因为 JSON 解析可能会失败。

结论

通过遵循本指南中的步骤,您可以轻松地将 JSON 数据反序列化为 Java 实体对象。这使您能够有效地处理和操作 JSON 数据。

Java的json反序列化:Java数据类可以和json数据结构不一致吗?

由于时间关系我也没有写全,这里提供一个思路吧。代码如下:

@Datapublic class Account {private int id;private String name;// @PowerfulAnnotation注解是我臆想的@PowerfulAnnotation()private String tokenId;@PowerfulAnnotation()private String key;}

@Target()@Retention()@Documentedpublic @interface PowerfulAnnotation {String value() default ;}

测试类:

一步一步指南:利用 JSON 将 Java 实体对象反序列化为对象 (一步步指导) 第1张

public class Main {public static void main(String[] args) throws Exception {Account account = new Account();String ori = {\n +\id\: ,\n +\name\: \小李\,\n +\token\: {\n +\id\: ,\n +\key\: \ddddddddd\\n +}\n +};Gson gson = new Gson();//字符串json转JsonObjectJsonObject jsonObject = (ori, );//反射获取目标对象属性for (Field field : ()()) {String fieldName = ();Class fieldClass = ();(当前field名:[ + fieldName + ],);(当前field类型:[ + fieldClass + ]);Annotation annotation = ();//检查是否有PowerfulAnnotation注解if (annotation != null) {PowerfulAnnotation powerful = (PowerfulAnnotation) annotation;String powerfulValue = ();(发现PowerfulAnnotation注解,值为:[ + powerfulValue + ]);String[] tmp = (\\.);//声明一个临时JsonObject,将用于获取下一层json对象JsonObject tmpJson = jsonObject;for (int i = 0; i < ; i++) {//目标值是在powerfulValue的最后一个字段,例如powerfulValue为的话,目标的值就是id,所以先获取token这个jsonObject,并赋值给临时tmpJsonif (i != - 1) {tmpJson = (tmp[i])();} else {//到达powerfulValue的最后一个字段,检查其类型,并赋值给目标对象Object value = checkFieldType(tmpJson, tmp[i], fieldClass);//从目标对象中获取目标属性Field targetField = ()(());(true);//解除私有限制(将[ + powerfulValue + ]的值[ + value + ]赋给目标对象的[ + fieldName + ]);//将值赋值给目标属性(account, value);}}}//属性上没有PowerfulAnnotation注解else {//检查当前属性的类型Object value = checkFieldType(jsonObject, fieldName, fieldClass);//从目标对象中获取目标属性Field targetField = ()(());(true);//解除私有限制(直接将值[ + value + ]赋给目标对象的[ + fieldName + ]);//将值赋值给目标属性(account, value);}(*********************************************\n);}(目标对象最终值: + account);}/*** 检查当前属性的类型* (这里由于时间关系,我没有写全,只检查了String、int、boolean类型,全类型应包括boolean、char、byte、short、int、long、float、double,你有时间自己补充一下)** 如果发现当前属性是一个对象,那么应该将JsonObject转换成对应的对象再返回(由于时间关系,这里我也没有试过,总之思路是这样)*/private static Object checkFieldType(JsonObject field, String fieldName, Class fieldClass) {if (fieldClass == ) {return (fieldName)();}if (fieldClass == ) {return (fieldName)();}if (fieldClass == ) {return (fieldName)();}return new Gson()((fieldName), fieldClass);}}

代码还没写完,主要集中在没有对JsonArray进行处理,当json串里包含数组时会报错,另外一些没写完的我在注释里写了点,你可以参照一下。整体思路还是利用java反射机制进行。

以上代码运行结果:

java如何实现对象的序列化

java实现对象的序列化的展示如下:

工具:戴尔灵越15、Windows10、JDK1.8、Eclipse4.10。

1、Java中需要序列化的类必须实现Serializable接口,这是一个空接口;为方便后续反序列化操作更顺畅,需要为这个实体类添加一个有默认值的serialVersionUID成员变量;后续步骤会展示如何将这个实体类对象进行序列化。

2、展示将对象序列化并写入到一个本地文件中:首先创建一个类,并声明一个成员方法;通过类ObjectOutputStream创建一个指向本地数据文件的IO流对象;通过调用上述对象的writeObject将对象的序列化数据写入到目标文件中;调用流对象的flush方法将缓冲区数据写出去;catch块处理好各种异常;finally块将IO流对象关闭。

3、编写并运行本地测试主方法:创建一个实体类对象;调用刚刚编写的方法将实体类对象的序列化数据写入到文件中。

4、查看本地文件,图示,其存储的就是实体类对象的序列化数据。

为什么需要序列化

Java对象是运行在JVM的堆内存中的,如果JVM停止后,它的生命也就戛然而止。

如果想在JVM停止后,把这些对象保存到磁盘或者通过网络传输到另一远程机器,磁盘这些硬件可不认识Java对象,它们只认识二进制这些机器语言,所以我们就要把这些对象转化为字节数组,这个过程就是序列化。

打个比喻,作为大城市漂泊的码农,搬家是常态。当我们搬书桌时,桌子太大了就通不过比较小的门,因此我们需要把它拆开再搬过去,这个拆桌子的过程就是序列化。而我们把书桌复原回来(安装)的过程就是反序列化啦。

.NET中JSON的序列化和反序列化的几种方式

一、什么是JSONJSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。 它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立 于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升 网络传输效率。 是JavaScript用来处理数据的一种格式,大部分是用来处理JavaScript和web服务器端之间的数据交换,把后台web服务器的数据传递到前台,然后使用JavaScript进 行处理,例如ajax等,是独立于语言和平台的轻量级的数据交换格式。 二、JSON语法1、JSON语法规则JS 语言中,一切都是对象。 因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。 但是对象和数组是比较特殊且常用的两种类型: 对象表示为键值对 数据由逗号分隔 花括号保存对象 方括号保存数组对象:对象在JS中是使用花括号包裹{}起来的内容,数据结构为{key1:value1, key2:value2, ...}的键值对结构。 在面向对象的语言中,key为对象的属性, value为对应的值。 键名可以使用整数和字符串来表示。 值的类型可以是任意类型。 {firstName: Brett, lastName: McLaughlin}数组:数组在JS中是方括号[]包裹起来的内容,数据结构为[, Javascript, Python, ...]的索引结构。 在JS中,数组是一种比较特殊的数据类型,它也可 以像对象那样使用键值对,但还是索引使用得多。 同样,值的类型可以是任意类型。 { people: [{ firstName: zhang, lastName: san }, { firstName: li, lastName: si } ]}2、JSON 键/值对JSON键值对是用来保存JS对象的一种方式,和JS对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号包裹,使用冒号:分隔,然后紧接着值: { firstName : Json } , 这很容易理解,等价于这条 JavaScript 语句: {firstName : Json } 。 3、JSON 与 JS 对象的关系JS对象的关系,可以这么理解:JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。 如:var obj = {a: Hello, b: World}; //这是一个对象,注意键名也是可以使用引号包裹的var json = {a: Hello, b: World}; //这是一个 JSON 字符串,本质是一个字符串4、JSON 和 JS 对象互转要实现从对象转换为 JSON 字符串,使用 () 方法:var json = ({a: Hello, b: World}); //结果是 {a: Hello, b: World}要实现从 JSON 转换为对象,使用 () 方法:var obj = ({a: Hello, b: World}); //结果是 {a: Hello, b: World}三、Json序列化方式1、JavaScriptSerializer使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集.中。 using ;PS: 可用[ScriptIgnore] 标记不序列化的属性Code:public ActionResult GetJsonDemo(){ //对象></param> /// <returns></returns> public static string ObjectToJson(object obj) { JavaScriptSerializer jsonSerialize = new JavaScriptSerializer(); return (obj); } /// <summary> /// 反序列化 /// </summary> /// <typeparam></typeparam> /// <param></param> /// <returns></returns> public static T JsonToObject<T>(string strJson) { JavaScriptSerializer jsonSerialize = new JavaScriptSerializer(); //<dynamic>(strJson); //取值model[Name]; 要使用索引取值,不能使用对象.属性 return <T>(strJson); } #endregion}Result:2、使用类库需要引入的命名空间 using ;PS: 可用[JsonIgnore]标记不序列化的属性Code:public ActionResult GetJsonDemo(){ //对象></param> /// <returns></returns> public static string ObjectToJson(object obj) { return (obj); } /// <summary> /// 反序列化 /// </summary> /// <typeparam></typeparam> /// <param></param> /// <returns></returns> public static T JsonToObject<T>(string strJson) { return <T>(strJson); } #endregion}Result:3、DataContractJsonSerializer使用DataContractJsonSerializer方式需要引入的命名空间,在.中。 using ;实体中的契约[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的,对于其他两种方式可加可不加。 PS: 可用[IgnoreDataMember] 标记不序列化的属性Code:public ActionResult GetJsonDemo(){ //对象></param> /// <returns></returns> public static string ObjectToJson(object obj) { using (MemoryStream stream = new MemoryStream()) {></typeparam> /// <param></param> /// <returns></returns> public static T JsonToObject<T>(string strJson) { using (MemoryStream stream = new MemoryStream((strJson))) { DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(typeof(T)); return (T)(stream); } } #endregion}Result:PS: DataModel[DataContract]public class DataModel{ [DataMember] public int ID { get; set; } [DataMember] public string Name { get; set; } [DataMember] public string Sex { get; set; } [DataMember] public int Age { get; set; }}四、总结1、JSON序列化有三种方式 JavaScriptSerializer类 类库 DataContractJsonSerializer类2、尽量使用(开源)来序列化和反序列化,性能好。

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

一步一步指南:利用 JSON 将 Java 实体对象反序列化为对象 (一步步指导) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
你上次访问网站的时间为:24-05-18,15:04:13 你第8访问网站的时间为:24-05-18 15:04:15