org.json简介

原文:https://www.studytonight.com/java-examples/introduction-to-orgjson

JSON 是 JavaScript 对象符号的缩写,是一种广泛用于存储和传输数据的文件格式。它使用人类可读的格式,以键值对或数组的形式存储数据。在本教程中,我们将学习如何在 org.json 库的帮助下在 Java 中使用 JSON。

org.json 图书馆

org.json 库为我们提供了许多使用 json 的类。它也被称为 Java-JSON 库。我们可以使用JSONObject类来创建 JSON 对象。我们还可以通过使用 JSONArray 类来创建 JSON 数组。它还为 JSON 到其他格式的转换提供了方便的类和方法。

org.json 中的 JSONObject

  • JSONObject 用于存储键值对。该键只能是非空字符串,但值可以是任何类型。
  • put() 方法用于向 JSONObject 添加键值对。
  • 我们可以使用 get(String key) 方法获取一个键对应的值。
  • 我们也可以使用 opt(String key) 方法来获取与该键关联的对象。
  • 这个类有很多可用的方法,但这些是最常用的。

下面的代码显示了这些方法的工作原理。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("one", 1);
        jsonObj.put("two", "2");
        jsonObj.put("three", false);
        jsonObj.put("four", JSONObject.NULL);

        System.out.println("The JSONObject is: " + jsonObj);
        System.out.println("get(one): " + jsonObj.get("one"));
        System.out.println("get(two): " + jsonObj.get("two"));
        System.out.println("get(three): " + jsonObj.get("three"));
        System.out.println("get(four): " + jsonObj.get("four"));
    }
}

JSON object 为:{“四”:null,“一”:1、“二”:“二”、“三”:false} get(一):1 get(二):2 get(三):false get(四):null

使用映射创建 Using 对象

JSONObject 构造器可以采用一个映射实例,它将使用映射中存在的键值对来初始化 JSONObject。

import java.util.HashMap;
import java.util.Map;
import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        Map<String, Integer> map = new HashMap<>();
        map.put("one", 1);
        map.put("two", 2);
        map.put("three", 3);
        map.put("four", 4);

        JSONObject jsonObj = new JSONObject(map);
        System.out.print(jsonObj);
    }
}

{“四”:4、“一”:1、“二”:2、“三”:3}

使用字符串创建 JSONObject

如果我们有一个有效的 JSON 字符串,那么我们可以使用这个字符串来初始化一个 JSON 对象。JSONObject 构造器可以用从 JSON 字符串中获得的键值对来初始化 JSONObject。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        String jsonStr = "{\"one\":\"1\",\"two\":\"2\",\"three\":\"3\"}";

        JSONObject jsonObj = new JSONObject(jsonStr);
        System.out.print(jsonObj);
    }
}

{“一”:“1”、“二”:“2”、“三”:“3”}

使用 Bean 类创建 JSONObject

我们可以将一个 Java Bean 类对象传递给 JSONObject 构造器,它将使用 Bean 对象中设置的类属性和值创建一个 JSON 对象。

为此,让我们使用下面的 Java Bean 类。

import java.io.Serializable;

public class Student implements Serializable
{
    private String name;
    private Double gpa;

    Student(){}
    Student(String s, Double d)
    {
        this.name = s;
        this.gpa = d;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Double getGpa() {
        return gpa;
    }
    public void setGpa(Double gpa) {
        this.gpa = gpa;
    }
}

现在,当我们使用这个类的一个实例创建一个 JSONObject 时,我们将使用名称和 GPA 作为键。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        Student student = new Student();
        student.setName("Justin");
        student.setGpa(8.50);

        JSONObject jsonObj = new JSONObject(student);
        System.out.print(jsonObj);
    }
}

{“姓名”:“贾斯汀”、“GPA”:8.5 }

org.json 中的 JSONArray

  • JSONArray 是一个有序的值集合。
  • put() 方法用于向数组中添加值。这些值可以是任何类型。
  • 我们可以使用 get() 方法通过它们的索引来获取这些值。
  • JSONArray 表示为以方括号开始和结束的字符串,包含逗号分隔的值。

让我们使用上面讨论的方法创建一个 JSONArray。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("one", 1);
        jsonObj.put("two", "2");

        JSONArray jsonArr = new JSONArray();
        //Adding values to the JSONArray
        jsonArr.put("String");
        jsonArr.put(100.0);
        jsonArr.put(JSONObject.NULL);
        jsonArr.put(jsonObj);

        System.out.println(jsonArr);
        System.out.println("Element at index 1:" + jsonArr.get(1));
        System.out.println("Element at index 3:" + jsonArr.get(3));
    }
}

[“String”,100,null,{“one”:1,“two”:“2”}] 索引 1 处的元素:100.0 索引 3 处的元素:{“one”:1,“two”:“2”}

使用字符串创建 JSONArray

JSONArray 构造器可以接受 JSON 字符串来初始化数组。确保传递给构造器的字符串是有效的 JSON 字符串。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        String jsonStr = "[1, \"String\", false]";
        JSONArray jsonArr = new JSONArray(jsonStr);

        System.out.print(jsonArr);
    }
}

【1,“弦”,假】

使用集合创建 JSONArray

我们也可以使用集合来初始化一个 JSONArray。JSONArray 构造器用于实现这一点。

import java.util.ArrayList;
import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        ArrayList<String> arrList = new ArrayList<>();
        arrList.add("one");
        arrList.add("2");
        arrList.add("three");

        JSONArray jsonArr = new JSONArray(arrList);
        System.out.print(jsonArr);
    }
}

【“一”、“二”、“三”】

json 组织中的 JSONTokener

JSONTokener 类用于将字符串拆分成单个字符。这个类不常用。我们有其他流行的 Java 方法可以达到同样的结果。这个类被其他类(JSONObject 和 JSONArray)用来解析 JSON 字符串。

让我们尝试使用这个类来拆分字符串。我们将使用 more() 方法来检查 JSONTokener 是否包含更多的字符。我们将使用 next() 方法获取单个字符。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        JSONTokener jsonTokener = new JSONTokener("This is a string.");
        while(jsonTokener.more())
            System.out.println(jsonTokener.next());
    }
}

T h I s T5】I s T8】a T10】s T r I n g 。

org.json 中的逗号分隔列表

org.json 库的逗号分隔列表(CDL)类提供了 JSONObject 或 JSONArray 与逗号分隔文本之间的简单转换方法。我们还需要 JSONTokener 来进行一些转换。

逗号分隔文本中的字符串

我们可以将逗号分隔的字符串转换为 JSONArray,方法是首先使用 JSONTokener,然后使用 CDL 类的row to sonarray()方法。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        String s = "This, is, a, string, .";
        JSONTokener jsonTokener = new JSONTokener(s);

        JSONArray jsonArrUsingCDL = CDL.rowToJSONArray(jsonTokener);
        System.out.print(jsonArrUsingCDL);
    }
}

【“这”、“是”、“一”、“串”、“”]

来自 JSONArray 的逗号分隔文本

要将我们的 JSONArray 转换为逗号分隔的字符串,我们可以使用 CDL 类的 rowToString() 方法。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        String s1 = "This, is, a, string, .";
        JSONTokener jsonTokener = new JSONTokener(s1);
        //String to JSONArray
        JSONArray jsonArrUsingCDL = CDL.rowToJSONArray(jsonTokener);
        System.out.println("JSON Array: " + jsonArrUsingCDL);
        //JSONArray to String
        String s2 = CDL.rowToString(jsonArrUsingCDL);
        System.out.print("String from JSON Array: " + s2);
    }
}

JSON 数组:【“这个”“是”“一个”“字符串”、】】【JSON 数组中的字符串:这是一个字符串。

逗号分隔文本中的 JSONObjects 数组

我们可以将字符串格式化为头(或键)和 JSONObject 值,以创建一个 JSONObjects 数组。我们将使用 CDL 类的 toJSONArray()方法。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        String jsonObjs = "name, gpa, regNo \n" //Headers
                        + "Justin, 8.21, 101 \n"//First JSONObject
                        + "Jessica, 8.55, 102 \n";     //Second JSONObject

        JSONArray jsonArr = CDL.toJSONArray(jsonObjs);
        System.out.println("First JSONObject in the JSONArray: " + jsonArr.get(0));
        System.out.println("First JSONObject in the JSONArray: " + jsonArr.get(1));
    }
}

JSON array 中的第一个 JSON object:{“regNo”:“101”、“name”:“Justin”、“GPA”:“8.21”} JSON array 中的第一个 JSON object:{“regNo”:“102”、“name”:“Jessica”、“GPA”:“8.55”}

toJSONArray()有一个重载方法,可以将另一个 JSONArray() 作为参数。这个 JSONArray 将包含 JSONObjects 的头(或键)。我们还需要一个包含 JSONObject 值的字符串。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        JSONArray header = new JSONArray();
        header.put("Name");
        header.put("GPA");
        header.put("RegNo");

        String jsonObjs = "Justin, 8.21, 101 \n"//First JSONObject
                + "Jessica, 8.55, 102 \n";     //Second JSONObject

        JSONArray jsonArr = CDL.toJSONArray(header, jsonObjs);
        System.out.println("First JSONObject in the JSONArray: " + jsonArr.get(0));
        System.out.println("First JSONObject in the JSONArray: " + jsonArr.get(1));
    }
}

JSON array 中的第一个 JSON object:{“RegNo”:“101”、“GPA”:“8.21”、“Name”:“Justin”} JSON array 中的第一个 JSON object:{“RegNo”:“102”、“GPA”:“8.55”、“Name”:“Jessica”}

org.json 库包含一个 Cookie 类,可以将 web 浏览器的 cookies 转换为 JSONObjects,并将 JSONObjects 转换回 cookies。

我们将使用这个类的to sonobject()来执行转换。确保表示 cookies 的字符串格式正确。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        String cookie = "username = Justin Kan; expires = Thu, 5 Jul 2021 12:00:00 UTC; path = /\"";
        JSONObject jsonObjCookie = Cookie.toJSONObject(cookie);
        System.out.println(jsonObjCookie);
    }
}

{“路径”:“/\”、“到期时间”:“世界协调时 2021 年 7 月 5 日星期四 12:00:00”、“名称”:“用户名”、“值”:“Justin Kan”}

这个类的 toString() 方法可以将包含 cookie 的 JSONObject 转换成字符串。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        //String cookie to JSONObject
        String cookie = "username = Justin Kan; expires = Thu, 5 Jul 2021 12:00:00 UTC; path = /\"";
        JSONObject jsonObjCookie = Cookie.toJSONObject(cookie);

        //JSONObject to String cookie
        String cookieFromJsonObj = Cookie.toString(jsonObjCookie);
        System.out.print(cookieFromJsonObj);
    }
}

用户名= Justin Kan 过期时间=世界协调时 2021 年 7 月 5 日星期四 12:00:00;路径=/”

组织类

org.json 库的 HTTP 类用于 HTTP 头和 JSONObjects 之间的转换。

HTTP 头字符串中的 JSONObject

就像 Cookie 类一样,HTTP 类也包含一个to sonobject()方法。这用于将一个 HTTP 头字符串转换为一个 JSONObject。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        String httpString = "POST \"http://www.somesite.com/\" HTTP/1.1";
        JSONObject httpJsonObj = HTTP.toJSONObject(httpString);
        System.out.print("HTTP JSON Object: " + httpJsonObj);
    }
}

HTTP JSON 对象:{“请求-URI”:“HTTP://www . somesite . com/”、“方法”:“POST”、“HTTP-Version”:“HTTP/1.1”}

来自 from 对象的 HTTP 头字符串

HTTP 类还包含 toString() 方法,该方法可以将包含 HTTP 头的 JSONObject 转换为字符串。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        JSONObject httpJsonObj = new JSONObject();
        httpJsonObj.put("Method", "POST");
        httpJsonObj.put("Request-URI", "http://www.somesite.com/");
        httpJsonObj.put("HTTP-Version", "HTTP/1.1");
        System.out.println("HTTP JSON Object: " + httpJsonObj);

        String stringFromHttpJsonObj = HTTP.toString(httpJsonObj);
        System.out.println("String from HTTP JSON Object: " + stringFromHttpJsonObj);
    }
}

HTTP JSON 对象:{“Request-URI”:“HTTP://www . somesite . com/”、“Method”:“POST”、“HTTP-Version”:“HTTP/1.1”} 字符串来自 HTTP JSON 对象:POST“HTTP://www . somesite . com/”HTTP/1.1

jsoneexception

在使用 org.json 库时,我们会经常遇到 JSONException。此异常还包含一条描述错误背后原因的消息。让我们看一看引发此错误的几个场景。

当我们使用无效密钥时,JSONException

如果我们尝试使用 get()方法获取一个 JSONObject 值,但该键不存在,将会返回此错误。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("one", 1);
        jsonObj.put("two", "2");
        jsonObj.put("three", false);
        jsonObj.put("four", JSONObject.NULL);

        System.out.println(jsonObj.get("five"));//Invalid Key    
    }
}

线程“main”org . JSON . jsonexception 中出现异常:未找到 JSONObject[“五”]。 在 org . JSON . JSON object . get(JSON object . Java:516) 在 Demo.main(Demo.java:13)

当我们使用无效的 JSON 字符串时,会出现 JSON 异常

我们学习了一些不同的方法,在这些方法中,我们将 JSON 字符串用于不同的目的。但是,如果字符串不是有效的 JSON 格式,那么我们将得到 JSONException。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        String jsonStr = "one : 1, two: 2, three: 3";

        JSONObject jsonObj = new JSONObject(jsonStr);
        System.out.print(jsonObj);
    }
}

线程“main”中的异常 org.json.JSONException:一个 JSONObject 文本必须在 org . JSON . jsontkener . syntaxerror(jsontkener . Java:413) 在 org . JSON . JSON object .(JSONObject.java:180) 在 org . JSON . JSON object .(JSONObject.java:420) 在 Demo.main(Demo.java:9)

当我们使用无效的 JSONArray 索引时,出现 JSONException

通常,如果我们试图使用一个无效的索引,我们会得到一个 ArrayIndexOutOfBounds 异常。对于 JSONArrays,我们将获得 JSONException。

import org.json.*;

public class Demo
{
    public static void main(String[] args) throws JSONException
    {
        JSONArray jsonArr = new JSONArray();
        //Adding values to the JSONArray
        jsonArr.put("String");
        jsonArr.put(100.0);
        jsonArr.put(JSONObject.NULL);

        System.out.println("Element at index 10:" + jsonArr.get(10));//Invalid Index
    }
}

线程“main”org . JSON . jsonexception 中出现异常:未找到 JSONArray[10]。 在 org . JSON . jsonarray . get(jsonarray . Java:247) 在 Demo.main(Demo.java:13)

摘要

json.org 是一个流行的 Java 包,用于与 JSON 一起工作。在本教程中,我们看了这个包的一些最重要的类和方法。我们还了解了 JSONException,这个包的所有类都使用它。