详谈Java中net.sf.json包关于JSON与对象互转的坑

讲解“详谈Java中net.sf.json包关于JSON与对象互转的坑”的完整攻略:

背景

JSON是一种轻量级的数据交换格式,以其简洁、易读、易解析的特点被广泛应用。而在Java中,开发者可使用net.sf.json包来轻松实现JSON与对象之间的互转。但在使用过程中,开发者需要注意一些注意事项,否则就会掉入JSON与对象互转的“坑”中。

坑点一:JSON属性命名与对象属性命名不一致

为了更好地理解坑点,我们需要一个示例。下面是一个Student类定义:

public class Student {
    private String name;
    private int age;
    private Date graduatingDate;

    // 省略getter和setter
}

需要将上述Student对象转为JSON字符串,代码如下:

Student student = new Student();
student.setName("Tom");
student.setAge(18);
student.setGraduatingDate(new Date());

JSONObject jsonObject = JSONObject.fromObject(student);
String jsonString = jsonObject.toString();
System.out.println(jsonString);

执行以上代码,生成的JSON字符串如下:

{"name":"Tom","age":18,"graduatingDate":"2021-12-17 14:10:14"}

再将JSON字符串转为Student对象,代码如下:

String jsonString = "{\"name\":\"Tom\",\"age\":18,\"gradDate\":\"2021-12-17 14:10:14\"}";

JSONObject jsonObject = JSONObject.fromObject(jsonString);
Student student = (Student) JSONObject.toBean(jsonObject, Student.class);
System.out.println(student.getName());

注意到上述代码中,JSON字符串中的“graduatingDate”属性与Student对象中的“gradDate”属性命名不一致。执行以上代码后,我们发现输出的姓名为null。这是由于在转为Student时,系统是根据属性名来匹配JSON和Java对象的。即使属性名大小写一致,但如果不一致,就会转换失败。所以,开发者在转换前,需仔细核对JSON属性和对象属性的命名是否一致。

坑点二:复杂对象转换失败

在开发中,我们经常会遇到复杂对象的转换。如果使用net.sf.json包的默认转换方式,会遇到两个问题:一是对象中的嵌套对象无法转换,二是会循环依赖。

为了解决这个问题,可使用net.sf.json包提供的JsonConfig和JsonFilter来实现。JsonConfig用于设置转换参数,JsonFilter用于指定不需要转换的属性。接下来,我们使用一个Teacher类演示转换复杂对象的过程。

public class Teacher {
    private String name;
    private int age;
    private List<Student> students; // 可能包含多个学生信息

    // 省略getter和setter
}

首先,我们实现将Teacher对象转为JSON字符串的方法:

public String teacher2Json(Teacher teacher) {
    JsonConfig jsonConfig = new JsonConfig();
    jsonConfig.setJsonPropertyFilter((jsonObject, name, value) -> 
        (value == null || "".equals(value)) && !"students".equals(name));

    return JSONObject.fromObject(teacher, jsonConfig).toString();
}

需要注意的是,我们过滤掉的属性包括了“students”,因为它包含了Student对象的嵌套。接下来,我们实现将JSON字符串转为Teacher对象的方法:

public Teacher json2Teacher(String jsonStr) {
    JsonConfig jsonConfig = new JsonConfig();
    jsonConfig.setJsonPropertyFilter((jsonObject, name, value) -> {
        if ("students".equals(name)) {
            return true;
        }

        try {
            jsonObject.getJSONObject(name);
        } catch (JSONException e) {
            return true;
        }

        return false;
    });

    JSONObject json = JSONObject.fromObject(jsonStr);
    return (Teacher) JSONObject.toBean(json, Teacher.class, new HashMap<>(), jsonConfig);
}

在转换JSON为Teacher对象时,我们使用了JsonConfig对象和JsonFilter来处理复杂对象。通过以上方法,我们将实现复杂对象和JSON之间的互相转换。

总结

以上就是关于Java中net.sf.json包关于JSON与对象互转的坑的攻略。值得注意的是,以上示例仅为一些常见的坑点,实际使用时还需注意其它细节问题。相信通过以上攻略,你已经掌握了在Java中使用net.sf.json包的技巧,可以更加自信的使用它来实现JSON与对象之间的互转。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详谈Java中net.sf.json包关于JSON与对象互转的坑 - Python技术站

(1)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • php好代码风格的阶段性总结

    PHP好代码风格的阶段性总结 为什么需要好的代码风格 良好的代码风格可以方便程序员查看、修改和维护代码。在团队合作开发中,一致的代码风格也有助于协作开发。 好的代码风格应该具备的特点 可读性强,注释清晰明了; 缩进和格式规范化; 变量和函数命名规范化; 代码冗余和复杂度控制; 合理的代码组织结构。 阶段性总结:如何实现好的代码风格 第一阶段:选择适合的代码风…

    Java 2023年5月26日
    00
  • 解决问题:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources

    解决问题: Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources 这个问题通常出现在使用Maven构建项目时,执行了clean install命令,Maven在构建过程中提示如下错误: Failed to execute goal org.…

    Java 2023年6月2日
    00
  • jsp ${param.id}用法

    JSP ${param.id}用法 JSP,即Java Server Pages,是一种在HTML页面中插入Java代码的技术。${param.id}是其中非常实用的一种用法,可以将从浏览器发起的GET或POST请求中携带的参数值展示在页面上。 基本用法 在JSP页面中可以使用${param.id}的语法来获取请求参数中“id”的值。例如,如果当前请求的UR…

    Java 2023年6月15日
    00
  • 详细聊一聊JavaWeb中的Request和Response

    接下来我将详细讲解一下JavaWeb中的Request和Response。 什么是Request和Response? 在JavaWeb中,客户端通过HTTP协议向服务器发送请求,服务器对请求进行处理后再返回相应的响应信息。JavaWeb中的Request和Response就是对HTTP请求和响应的封装。 Request(请求)对象是由客户端发送到服务器的,并…

    Java 2023年5月20日
    00
  • java基础的详细了解第七天

    Java基础的详细了解第七天攻略 在第七天的学习中,我们将了解Java的异常处理机制。异常是指程序运行期间发生的不正常情况,如除数为0,数组越界等等。在Java中,异常处理机制提供了异常的捕获、处理和抛出的操作,可以帮助我们提高程序的健壮性。 异常类的层次结构 在Java中,异常类是按照树形结构进行组织的,最顶层是Throwable类,下面分为两个子类,分别…

    Java 2023年5月23日
    00
  • java编程中拷贝数组的方式及相关问题分析

    下面是关于 “java编程中拷贝数组的方式及相关问题分析” 的完整攻略。 一、概述 在 Java 编程中,拷贝数组是一项非常重要的操作。它允许我们创建拷贝而非引用数组,这样我们就可以在更改数组内容的过程中保持原数组不变。在这篇攻略中,我们将探讨拷贝数组的不同方式以及如何使用每种方式。 二、使用 System 类的 clone() 方法 System 类的 c…

    Java 2023年5月26日
    00
  • Java 网络爬虫基础知识入门解析

    Java 网络爬虫基础知识入门解析 概述 网络爬虫是一种通过编程方式自动化提取互联网上数据的技术。对于Java开发者而言,使用Java的网络爬虫应该会是最自然的想法。本文将介绍Java网络爬虫的基础知识,以及如何使用Java实现一个网络爬虫。 爬虫原理 一个基本的网络爬虫需要完成以下几个步骤: 发送HTTP请求获取页面内容 解析获取到的页面内容 保存所需的数…

    Java 2023年5月23日
    00
  • java web开发之购物车功能实现示例代码

    下面是关于“Java Web开发之购物车功能实现示例代码”的完整攻略。 一、需求分析这个任务要求我们开发一个在线购物网站,并实现购物车功能。购物车需要实现添加商品、移除商品以及结算等操作。 二、技术选型和建立项目基于以上需求,可以决定使用Java Web技术实现网站和购物车功能,并建立一个Maven项目。这里以Spring MVC为例。 三、数据库设计数据库…

    Java 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部