Java用 Rhino/Nashorn 代替第三方 JSON 转换库

使用 Rhino/Nashorn 代替第三方 JSON 转换库的攻略如下:

背景

在 Java 开发中,我们经常需要将 Java 对象转成 JSON 格式,或者将 JSON 格式转成 Java 对象。通常情况下,我们会依赖第三方 JSON 转换库,如 fastjson、Jackson、Gson 等。但是,Rhino 和 Nashorn 都提供了 JSON 的解析与生成的功能,所以我们可以不依赖任何第三方库,达到相同的目的。

Rhino 在 Java 中的应用

Rhino 是一个 JavaScript 引擎,在 Java 中可以直接使用。JSONObject 和 JSONTokener 类都是 Rhino 中提供的,能够很方便地完成 JSON 的解析和生成。

以下是一个将 Java 对象转成 JSON 的示例:

import org.mozilla.javascript.NativeObject;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
import org.mozilla.javascript.json.JsonParser;
import java.util.HashMap;
import java.util.Map;

public class Demo {
  public static void main(String[] args) throws Exception {
    Map<String, Object> map = new HashMap<>();
    map.put("name", "Alice");
    map.put("age", 20);
    map.put("gender", "female");

    Scriptable scope = new NativeObject();
    ScriptableObject.putProperty(scope, "obj", map);

    String json = (String) new JsonParser(scope).parseValue(scope, "JSON.stringify(obj)");
    System.out.println(json);
  }
}

在这个示例代码中,我们使用了 org.mozilla.javascript 中的 NativeObject 和 Scriptable 类来创建一个 JavaScript 对象。然后,我们使用 ScriptableObject 将 Java 对象存储进 JavaScript 对象中。接下来,我们使用 org.mozilla.javascript.json.JsonParser 中的 parseValue 方法将 JavaScript 对象转成 JSON 字符串。

Nashorn 在 Java 中的应用

Nashorn 是 Java 8 中引入的新的 JavaScript 引擎,与 Rhino 相比,它的性能更好,而且在支持 ECMAScript 5.1 标准的基础上还增加了对 ECMAScript 6 和 7 的支持。Nashorn 中也提供了 JSON 的解析和生成的功能。

以下是一个将 JSON 字符串转成 Java 对象的示例:

import jdk.nashorn.api.scripting.ScriptObjectMirror;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Demo {
  public static void main(String[] args) throws Exception {
    String json = "{\"name\": \"Alice\", \"age\": 20, \"gender\": \"female\"}";

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("javascript");
    ScriptObjectMirror mirror = (ScriptObjectMirror) engine.eval("(" + json + ")");

    String name = mirror.get("name").toString();
    int age = Integer.parseInt(mirror.get("age").toString());
    String gender = mirror.get("gender").toString();

    System.out.println("Name: " + name + ", Age: " + age + ", Gender: " + gender);
  }
}

在这个示例代码中,我们首先定义了一个 JSON 字符串,然后使用 javax.script 包下的 ScriptEngineManager 和 ScriptEngine 类来执行 JavaScript 代码。我们使用 eval 方法将 JSON 字符串转成 JavaScript 对象,并将其转成 ScriptObjectMirror 对象。接着,我们通过 ScriptObjectMirror 对象访问 JavaScript 对象中的属性,将属性值转成 Java 对象即可。

需要注意的是,Nashorn 引擎默认是开启“strict mode”,如果你的 JSON 格式不规范,可能会导致异常的抛出,因此需要特别注意输入JSON的格式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java用 Rhino/Nashorn 代替第三方 JSON 转换库 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Linux下Oracle设置定时任务备份数据库的教程

    下面我就来详细讲解Linux下Oracle设置定时任务备份数据库的完整攻略: 一、前置条件 在进行设置定时任务备份数据库的过程中,需要满足以下前置条件: 已经搭建好了Oracle数据库环境,并且可以使用Oracle用户进行操作。 安装了crontab服务。 二、备份数据库的命令 在进行定时任务备份数据库之前,我们需要先了解备份数据库的命令。常用的备份数据库命…

    database 2023年5月22日
    00
  • mybatis单笔批量保存实体数据的方法

    一、概述 mybatis 是一个优秀的 ORM 框架,提供了单笔保存实体数据的方法,也支持批量保存实体数据的方法。批量保存实体数据要比单笔保存实体数据的效率高,因为避免了频繁连接数据库以及频繁提交 SQL 的开销。本文将详细讲解 mybatis 单笔批量保存实体数据的方法。 二、单笔保存实体数据 单笔保存实体数据的方法比较简单,代码如下: Integer s…

    database 2023年5月21日
    00
  • Redis高可用配置(Keepalived)

    主:172.16.0.104 备:172.16.0.105 VIP:172.16.0.107 客户端直接连VIP,当master 104的redis挂掉后,105作为master。当104重启后,104作为105的slave。当105又挂掉之后,104作为master…… 1、安装redis并配置主从同步      安装过程省略     1.1 配置…

    Redis 2023年4月13日
    00
  • 使用JDBC4.0操作XML类型的字段(保存获取xml数据)的方法

    操作XML类型的字段需要用到JDBC4.0以上版本的驱动和数据库系统支持XML数据类型,以下是操作XML类型字段的完整攻略: 第一步:创建XML类型字段 在创建表的时候,可以指定一个XML类型的字段,例如MySQL创建如下表: CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `…

    database 2023年5月21日
    00
  • 详解SQLite中的数据类型

    详解SQLite中的数据类型 SQLite中的数据类型是决定存储在数据库中数据格式的基础。SQLite提供了五种原始数据类型和三种大对象(LOB)类型,包括: NULL:表示一个无效值或空值。 INTEGER:表示带符号的整数值,可以是1,2,3,4,6,或8字节长度。 REAL:浮点数值,存储为8字节的IEEE浮点数字,仅适用于一些需要精确浮点数运算的场景…

    database 2023年5月19日
    00
  • sqlplus登录\连接命令、sqlplus命令的使用大全

    以下是关于”sqlplus登录\连接命令、sqlplus命令的使用大全”的一份完整攻略: SQLPlus登录\连接命令 1. 语法 sqlplus [用户名]/[密码]@[连接串] 用户名:指数据库中已创建的用户的名称,没有指定默认为SYS用户; 密码:指该用户的密码; 连接串:指连接到的数据库实例的系统名称,格式为”[主机名]:[端口号]/[服务名]” 2…

    database 2023年5月21日
    00
  • SQL server中提示对象名无效的解决方法

    SQL Server中提示对象名无效(Object name is not valid)通常是由于以下原因引起的: 对象名未正确命名 缺少所需的权限 对象不存在 下面介绍几种可能造成此问题的解决方法。 方法一:检查对象命名并添加方括号 可能出现的原因之一是对象名称没有正确命名,如果对象名称包含不规则字符,如空格和其他标点符号,则必须添加方括号以正确引用该对象…

    database 2023年5月21日
    00
  • MySQL 查询 并集、交集、差集方式

    下面我来对MySQL查询中并集、交集、差集的使用方法进行讲解。 什么是并集、交集、差集 在介绍相关的MySQL查询语句之前,我们先来了解一下这三个概念: 并集:两个集合中的所有元素在合并后仍然是唯一的。 交集:两个集合中共同拥有的元素组成的集合。 差集:指包含在集合 A 但不包含在集合 B 中的元素。 MySQL查询语句 并集查询 并集查询使用UNION关键…

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