详谈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日

相关文章

  • 详解web存储中的storage

    详解Web存储中的Storage 一、Storage简介 Storage是Web API的一部分,提供了在浏览器本地存储数据的功能。Storage分为两种类型:localStorage和sessionStorage。 localStorage和sessionStorage的区别在于,localStorage中存储的数据没有时间限制,除非用户手动删除;而ses…

    Java 2023年6月15日
    00
  • 项目讲解之常见安全漏洞

    本文是从开源项目 RuoYi 的提交记录文字描述中根据关键字漏洞|安全|阻止筛选而来。旨在为大家介绍日常项目开发中需要注意的一些安全问题以及如何解决。 项目安全是每个开发人员都需要重点关注的问题。如果项目漏洞太多,很容易遭受黑客攻击与用户信息泄露的风险。本文将结合3个典型案例,解释常见的安全漏洞及修复方案,帮助大家在项目开发中进一步提高安全意识。 RuoYi…

    Java 2023年4月19日
    00
  • Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

    当Java程序尝试使用javax.xml.transform包中的Transformer类转换XML文档时,有时会出现“javax.xml.transform.TransformerException: java.lang.NullPointerException”错误。这个错误通常表示程序在加载XML文档时遇到了一个空指针异常。以下是解决该问题的步骤和示例…

    Java 2023年5月27日
    00
  • Java多线程案例之阻塞队列详解

    Java多线程案例之阻塞队列详解 什么是阻塞队列? 阻塞队列(Blocking Queue)是一个支持在队列的两端进行插入与删除的队列。常用的阻塞队列有ArrayBlockingQueue、LinkedBlockingQueue等。阻塞队列在多线程的场景下常被使用,因为当队列为空或达到容量上限时,线程往往会被阻塞。在队列空的情况下,从队列中获取元素的操作将会…

    Java 2023年5月18日
    00
  • struts2入门(搭建环境、配置、示例)详解

    Struts2入门攻略 Struts2是一个基于MVC架构的Web应用程序开发框架。本攻略将介绍如何搭建Struts2开发环境、配置Struts2框架并开发示例项目。 环境搭建 首先,我们需要准备好开发环境: JDK:Java开发工具包,下载地址:https://www.oracle.com/technetwork/java/javase/downloads…

    Java 2023年5月20日
    00
  • java暴力匹配及KMP算法解决字符串匹配问题示例详解

    Java暴力匹配及KMP算法解决字符串匹配问题 1. 概述 在字符串匹配问题中,有两种经典的算法:暴力匹配和KMP算法。暴力匹配是最简单的字符串匹配算法,其思路是将字符串的每个子串与目标字符串进行匹配。KMP算法是一种更高效的字符串匹配算法,它通过预处理字符串的next数组来避免不必要的字符比较,从而在匹配过程中提高效率。 2. Java暴力匹配 暴力匹配算…

    Java 2023年5月19日
    00
  • Spring Boot+微信小程序开发平台保存微信登录者的个人信息

    这里提供一份完整的“Spring Boot + 微信小程序开发平台保存微信登录者的个人信息”的攻略,下面将分为以下几个方面进行讲解。 1. 小程序登录流程 在小程序中,用户登录的流程如下: 用户进入小程序,点击登录按钮。 微信端会弹出授权窗口,提示用户是否授权小程序登录。 用户点击同意授权后,微信将会返回一个 code 值给小程序端。 小程序端通过 code…

    Java 2023年6月3日
    00
  • Java实用工具之使用oshi获取主机信息的方法

    下面我将详细讲解“Java实用工具之使用oshi获取主机信息的方法”的完整攻略,同时提供两个示例说明。 1. Oshi是什么 Oshi是一个用于获取系统信息的Java开源库。它可以提供操作系统、硬件、网络和进程的信息,包括可用内存、CPU负载、磁盘空间、网络接口和传输速度、运行的进程和线程、以及其它监控信息等。同时,Oshi支持Windows、Linux、O…

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