📜  如何在Java中解析 JSON

📅  最后修改于: 2022-05-13 01:55:41.235000             🧑  作者: Mango

如何在Java中解析 JSON

JSON(JavaScript Object Notation)是一种轻量级、基于文本、独立于语言的数据交换格式,易于人类和机器读写。 JSON 可以表示两种结构化类型:对象和数组。对象是零个或多个名称/值对的无序集合。数组是零个或多个值的有序序列。值可以是字符串、数字、布尔值、null 以及这两种结构化类型。

下面是一个来自 Wikipedia 的简单示例,它显示了描述一个人的对象的 JSON 表示。该对象具有名字和姓氏的字符串值、年龄的数字值、表示人员地址的对象值和电话号码对象的数组值。

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": 10021
    },
    "phoneNumbers": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567" 
        }
    ] 
}

Java 中的 JSON 处理用于 JSON 处理的Java API JSON.simple 是一个简单的Java库,允许解析、生成、转换和查询 JSON。

入门:在编译和运行以下示例代码之前,您需要下载 json-simple-1.1 jar 并将其放入您的 CLASSPATH 中。

  • 要在 IDE 中导入 jar,如 eclipse,请参阅此处。
  • 如果您使用的是 maven,您可以使用以下 maven 链接 https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple/1.1.1

Json-Simple API:它为 JSON 对象和数组结构提供对象模型。这些 JSON 结构使用JSONObjectJSONArray类型表示为对象模型。 JSONObject 提供了一个 Map 视图来访问模型中零个或多个名称/值对的无序集合。类似地,JSONArray 提供了一个 List 视图来访问模型中零个或多个值的有序序列。

将 JSON 写入文件

让我们看一个在 JSONObject 和 JSONArray 的帮助下将上述 JSON 数据写入文件“JSONExample.json”的示例。

// Java program for write JSON to a file
  
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.LinkedHashMap;
import java.util.Map;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
  
public class JSONWriteExample
{
    public static void main(String[] args) throws FileNotFoundException 
    {
        // creating JSONObject
        JSONObject jo = new JSONObject();
          
        // putting data to JSONObject
        jo.put("firstName", "John");
        jo.put("lastName", "Smith");
        jo.put("age", 25);
          
        // for address data, first create LinkedHashMap
        Map m = new LinkedHashMap(4);
        m.put("streetAddress", "21 2nd Street");
        m.put("city", "New York");
        m.put("state", "NY");
        m.put("postalCode", 10021);
          
        // putting address to JSONObject
        jo.put("address", m);
          
        // for phone numbers, first create JSONArray 
        JSONArray ja = new JSONArray();
          
        m = new LinkedHashMap(2);
        m.put("type", "home");
        m.put("number", "212 555-1234");
          
        // adding map to list
        ja.add(m);
          
        m = new LinkedHashMap(2);
        m.put("type", "fax");
        m.put("number", "212 555-1234");
          
        // adding map to list
        ja.add(m);
          
        // putting phoneNumbers to JSONObject
        jo.put("phoneNumbers", ja);
          
        // writing JSON to file:"JSONExample.json" in cwd
        PrintWriter pw = new PrintWriter("JSONExample.json");
        pw.write(jo.toJSONString());
          
        pw.flush();
        pw.close();
    }
}

文件“JSONExample.json”的输出:

{
     "lastName":"Smith",
    "address":{
        "streetAddress":"21 2nd Street",
         "city":"New York",
         "state":"NY",
         "postalCode":10021
    },
     "age":25,
     "phoneNumbers":[
            {
            "type":"home", "number":"212 555-1234"
            },
         {
            "type":"fax", "number":"212 555-1234"
         }
     ],
     "firstName":"John"
}

注意:在 JSON 中,对象是一组无序的名称/值对,因此 JSONObject 不保留对象名称/值对的顺序,因为它(根据定义)并不重要。因此,在我们的输出文件中,不保留顺序。

从文件中读取 JSON

让我们看一个示例,它在 JSONParser、JSONObject 和 JSONArray 的帮助下从上面创建的文件“JSONExample.json”中读取 JSON 数据。

// Java program to read JSON from a file
  
import java.io.FileReader;
import java.util.Iterator;
import java.util.Map;
  
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.*;
  
public class JSONReadExample 
{
    public static void main(String[] args) throws Exception 
    {
        // parsing file "JSONExample.json"
        Object obj = new JSONParser().parse(new FileReader("JSONExample.json"));
          
        // typecasting obj to JSONObject
        JSONObject jo = (JSONObject) obj;
          
        // getting firstName and lastName
        String firstName = (String) jo.get("firstName");
        String lastName = (String) jo.get("lastName");
          
        System.out.println(firstName);
        System.out.println(lastName);
          
        // getting age
        long age = (long) jo.get("age");
        System.out.println(age);
          
        // getting address
        Map address = ((Map)jo.get("address"));
          
        // iterating address Map
        Iterator itr1 = address.entrySet().iterator();
        while (itr1.hasNext()) {
            Map.Entry pair = itr1.next();
            System.out.println(pair.getKey() + " : " + pair.getValue());
        }
          
        // getting phoneNumbers
        JSONArray ja = (JSONArray) jo.get("phoneNumbers");
          
        // iterating phoneNumbers
        Iterator itr2 = ja.iterator();
          
        while (itr2.hasNext()) 
        {
            itr1 = ((Map) itr2.next()).entrySet().iterator();
            while (itr1.hasNext()) {
                Map.Entry pair = itr1.next();
                System.out.println(pair.getKey() + " : " + pair.getValue());
            }
        }
    }
}

输出:

John
Smith
25
streetAddress : 21 2nd Street
postalCode : 10021
state : NY
city : New York
number : 212 555-1234
type : home
number : 212 555-1234
type : fax