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日

相关文章

  • Oracle解析复杂json的方法实例详解

    Oracle解析复杂JSON的方法实例详解 本文将介绍Oracle数据库中解析复杂JSON数据的方法,我们将结合实例演示具体的步骤。 1. 准备工作 在开始之前,您需要确保以下事项已得到满足: 已安装Oracle数据库。 已创建存储JSON数据的表格。 2. 解析简单JSON 如果您的JSON数据较为简单,您可以使用Oracle提供的SQL函数来进行解析。下…

    database 2023年5月21日
    00
  • MySQL ALTER命令知识点汇总

    MySQL ALTER命令知识点汇总 什么是ALTER命令 ALTER命令是MySQL用来修改已有的表结构的命令。使用ALTER命令可以修改表名,增加、删除列,修改列的数据类型或属性,以及修改表级约束等。 常见的ALTER命令语法 修改表名 ALTER TABLE table_name RENAME TO new_table_name; 添加新列 ALTER…

    database 2023年5月22日
    00
  • Codeigniter操作数据库表的优化写法总结

    下面是关于Codeigniter操作数据库表的优化写法总结的完整攻略。 一、Codeigniter操作数据库表的基本优化 Codeigniter是一个快速的PHP轻量级Web应用程序开发框架,它可以协助开发者快速而且简单的创建Web应用程序。在Codeigniter中操作数据库表的优化关键有以下几点: 1. 数据库优化 在操作数据库表之前,需要对数据库进行优…

    database 2023年5月19日
    00
  • Oracle 12c如何卸载?Windows7上完全卸载Oracle 12c操作步骤(图解教程)

    下面是详细讲解“Oracle 12c如何卸载?Windows7上完全卸载Oracle 12c操作步骤(图解教程)”的完整攻略: 简介 Oracle 12c是很多程序员工作中常用的数据库管理系统。但有时候我们需要卸载它,可能是因为要换成其他版本,或者是重新安装。本文将介绍在Windows7上如何完全卸载Oracle 12c。 环境 本文所使用的环境如下:- 操…

    database 2023年5月22日
    00
  • php日期转时间戳,指定日期转换成时间戳

    要将日期转换为时间戳,可以使用PHP中的strtotime()函数。 该函数将日期时间字符串转换为指定格式的Unix时间戳。以下是使用该函数将日期转换为时间戳的步骤: 步骤一:使用strtotime()函数将指定日期时间字符串转换为Unix时间戳。 步骤二:在获取到时间戳后,存储该值,以备以后使用。 下面我们分别来演示一下两个案例。 案例一:将当前日期时间转…

    database 2023年5月22日
    00
  • 使用 MySQL Date/Time 类型

    使用MySQL Date/Time类型是非常常见的,它可以在MySQL中存储时间和日期,并能对这些时间和日期进行运算和比较操作。 1. MySQL Date/Time类型 MySQL中有多种Date/Time类型,包括DATE、TIME、DATETIME、TIMESTAMP等。 DATE类型用于存储日期,格式为’YYYY-MM-DD’。 TIME类型用于存储…

    database 2023年5月22日
    00
  • 在Jpa框架下拼接原生sql 并执行的操作

    在JPA框架下,需要执行原生SQL时,可以使用EntityManager对象中的createNativeQuery方法实现。下面是详细步骤: 1. 创建EntityManager对象 要执行原生SQL操作,需要先创建EntityManager对象,方法如下: EntityManagerFactory entityManagerFactory = Persis…

    database 2023年5月21日
    00
  • 2018.09.17MySql报错1062

    一、 在执行sql语句时出现了一个错误:1062:Duplicate entry ‘0’ for key ‘PRIMARY’ 二、报错原因:Navicat中,本来没有主键id,后来要加入主键id,但是原来的表中已经有了一个主键,创建完id后,保存不了,报这个错:Duplicate entry ‘0’ for key ‘PRIMARY’; 三、解决方法:在Na…

    MySQL 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部