<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Java JSON 處理教程 原文:http://zetcode.com/java/jsonp/ Java JSON 處理教程展示了如何使用 JSON-P 庫來處理 JSON。 這些示例將 Java 對象寫入 JSON 文件,并將 JSON 數據讀取到 Java 對象。 在作者的 Github [倉庫](https://github.com/janbodnar/Java-Advanced/tree/master/json/jsonp)中提供了代碼示例。 ## JSON-P 用于 JSON 處理的 Java API(JSON-P)提供可移植的 API,以使用對象模型和流式 API 來解析,生成,轉換和查詢 JSON。 JSON-P 中使用 JSON 的兩種方式有兩種:流式 API 和對象模型 API。 ## JSON-P 流式 API 流式 API 將解析和生成控制移交給程序員。 流式 API 提供了基于事件的解析器,并允許應用開發者請求下一個事件,而不是在回調中處理該事件。 這稱為拉方法。 | 名稱 | 描述 | | --- | --- | | `Json` | 包含用于創建 JSON 解析器,生成器及其工廠的靜態方法。 | | `JsonParser` | 表示一個基于事件的解析器,它從流中讀取 JSON 數據。 | | `JsonGenerator` | 將 JSON 數據一次寫入一個值。 | ## JSON-P 對象模型 API 對象模型 API 創建一個樹形結構,表示內存中的 JSON 數據。 可以靈活地導航和查詢樹。 另一方面,對象模型 API 的效率通常不如流模型,并且需要更多的內存。 | 名稱 | 描述 | | --- | --- | | `Json` | 包含用于創建 JSON 解析器,生成器及其工廠的靜態方法。 | | `JsonObjectBuilder` | 通過添加應用代碼中的值在內存中創建對象模型。 | | `JsonArrayBuilder` | 通過添加應用代碼中的值在內存中創建數組模型。 | | `JsonReader` | 從輸入源讀取`JsonObject`或`JsonArray`。 | | `JsonWriter` | 將`JsonObject`或`JsonArray`寫入輸出源。 | `JsonValue`,`JsonObject`,`JsonArray`,`JsonString`和`JsonNumber`是 JSON 數據類型。 在我們的示例中,我們使用 JDK 11 和 Maven 創建我們的應用。 ```java <dependencies> <dependency> <groupId>javax.json</groupId> <artifactId>javax.json-api</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.json</artifactId> <version>1.1</version> </dependency> </dependencies> ``` 在項目中,我們使用`javax.json-api`和`javax.json`依賴項。 ## JSON-P `JsonObjectBuilder`示例 在第一個示例中,我們使用對象生成器創建 JSON 字符串。 `JsonObjectBuilderEx.java` ```java package com.zetcode; import javax.json.Json; import java.time.LocalDate; public class JsonObjectBuilderEx { public static void main(String[] args) { var born = LocalDate.of(1992, 3, 2).toString(); var json = Json.createObjectBuilder() .add("name", "John Doe") .add("occupation", "gardener") .add("born", born).build(); var result = json.toString(); System.out.println(result); } } ``` JSON 字符串被打印到控制臺。 ```java var json = Json.createObjectBuilder() .add("name", "John Doe") .add("occupation", "gardener") .add("born", born).build(); ``` 用`createObjectBuilder()`創建一個`JsonObjectBuilder`。 新的對將插入`add()`。 最后,使用`build()`結束字符串。 ```java var result = json.toString(); ``` 我們使用`toString()`將`JsonObject`轉換為字符串。 ```java {"name":"John Doe","occupation":"gardener","born":"1992-03-02"} ``` 這是輸出。 ## `PRETTY_PRINTING` 通過`JsonGenerator.PRETTY_PRINTING`配置設置,我們可以設置寫入器進行漂亮的打印。 `JsonPrettyPrintEx.java` ```java package com.zetcode; import javax.json.Json; import javax.json.stream.JsonGenerator; import java.io.StringWriter; import java.time.LocalDate; import java.util.HashMap; public class JsonPrettyPrintEx { public static void main(String[] args) { var born = LocalDate.of(1992, 3, 2).toString(); var json = Json.createObjectBuilder() .add("name", "John Doe") .add("occupation", "gardener") .add("born", born).build(); var config = new HashMap<String, Boolean>(); config.put(JsonGenerator.PRETTY_PRINTING, true); var jwf = Json.createWriterFactory(config); var sw = new StringWriter(); try (var jsonWriter = jwf.createWriter(sw)) { jsonWriter.writeObject(json); System.out.println(sw.toString()); } } } ``` 在示例中,我們創建一個 JSON 對象并將其打印到控制臺。 輸出打印精美。 ```java var config = new HashMap<String, Boolean>(); config.put(JsonGenerator.PRETTY_PRINTING, true); var jwf = Json.createWriterFactory(config); ``` 配置文件被傳遞到`JsonWriterFactory`。 ```java { "name": "John Doe", "occupation": "gardener", "born": "1992-03-02" } ``` 這是輸出。 ## JSON-P `JsonArrayBuilder` `JsonArrayBuilder`是用于創建和修改`JsonArray`對象的構建器。 `JsonArrayBuilderEx.java` ```java package com.zetcode; import javax.json.Json; import javax.json.stream.JsonGenerator; import java.io.StringWriter; import java.time.LocalDate; import java.util.HashMap; import java.util.List; public class JsonArrayBuilderEx { public static void main(String[] args) { var ab = Json.createArrayBuilder(); var users = createUsers(); users.forEach(user -> { var ob = Json.createObjectBuilder(); ob.add("name", user.getName()); ob.add("occupation", user.getOccupation()); ob.add("born", user.getBorn().toString()); ab.add(ob); }); var config = new HashMap<String, Boolean>(); config.put(JsonGenerator.PRETTY_PRINTING, true); var jwf = Json.createWriterFactory(config); var sw = new StringWriter(); try (var jsonWriter = jwf.createWriter(sw)) { jsonWriter.writeArray(jsonArray); System.out.println(sw); } } public static List<User> createUsers() { var born1 = LocalDate.of(1992, 3, 2); var u1 = new User("John Doe", "gardener", born1); var born2 = LocalDate.of(1967, 11, 22); var u2 = new User("Brian Flemming", "teacher", born2); var born3 = LocalDate.of(1995, 4, 7); var u3 = new User("Lucy Black", "accountant", born3); var born4 = LocalDate.of(1972, 8, 30); var u4 = new User("John Doe", "gardener", born4); return List.of(u1, u2, u3, u4); } } ``` 在該示例中,我們創建了一個用戶對象列表,并將其轉換為`JsonArray`。 ```java var ab = Json.createArrayBuilder(); ``` 用`createArrayBuilder()`創建一個`JsonArrayBuilder`。 ```java users.forEach(user -> { var ob = Json.createObjectBuilder(); ob.add("name", user.getName()); ob.add("occupation", user.getOccupation()); ob.add("born", user.getBorn().toString()); ab.add(ob); }); ``` 在此`for`循環中,我們創建 JSON 對象并將其添加到構建器中。 ```java var jsonArray = ab.build(); ``` `build()`方法從構建器創建`JsonArray`。 ```java jsonWriter.writeArray(jsonArray); ``` `JsonArray`被寫入寫入器。 ```java [ { "name": "John Doe", "occupation": "gardener", "born": "1992-03-02" }, { "name": "Brian Flemming", "occupation": "teacher", "born": "1967-11-22" }, { "name": "Lucy Black", "occupation": "accountant", "born": "1995-04-07" }, { "name": "John Doe", "occupation": "gardener", "born": "1972-08-30" } ] ``` 這是輸出。 ## JSON-P `JsonParser` `JsonParser`使用請求解析編程模型解析 JSON。 在此模型中,客戶端代碼控制線程并在處理每個元素之后調用方法`next()`將解析器前進到下一個狀態。 解析器生成以下事件之一:`START_OBJECT`,`END_OBJECT`,`START_ARRAY`,`END_ARRAY`,`KEY_NAME`,`VALUE_STRING`,`VALUE_NUMBER`,`VALUE_TRUE`,`VALUE_FALSE`和`VALUE_NULL`。 `users.json` ```java [ { "name": "John Doe", "occupation": "gardener", "born": "1992-03-02" }, { "name": "Brian Flemming", "occupation": "teacher", "born": "1967-11-22" }, { "name": "Lucy Black", "occupation": "accountant", "born": "1995-04-07" }, { "name": "William Bean", "occupation": "pilot", "born": "1977-10-31" } ] ``` 我們將解析`users.json`文件。 `JsonParserSimpleEx.java` ```java package com.zetcode; import javax.json.Json; import javax.json.stream.JsonParser; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.nio.charset.StandardCharsets; public class JsonParserSimpleEx { public static void main(String[] args) throws FileNotFoundException { var is = new FileInputStream("src/main/resources/users.json"); var factory = Json.createParserFactory(null); var parser = factory.createParser(is, StandardCharsets.UTF_8); if (!parser.hasNext() && parser.next() != JsonParser.Event.START_ARRAY) { return; } // looping over object attributes while (parser.hasNext()) { var event = parser.next(); // starting object if (event == JsonParser.Event.START_OBJECT) { while (parser.hasNext()) { event = parser.next(); if (event == JsonParser.Event.KEY_NAME) { var key = parser.getString(); switch (key) { case "name": parser.next(); System.out.printf("Name: %s%n", parser.getString()); break; case "occupation": parser.next(); System.out.printf("Occupation: %s%n", parser.getString()); break; case "born": parser.next(); System.out.printf("Born: %s%n%n", parser.getString()); break; } } } } } } } ``` 在示例中,我們使用 JSON-P 流式 API 解析`users.json`文件。 ```java var is = new FileInputStream("src/main/resources/users.json"); var factory = Json.createParserFactory(null); var parser = factory.createParser(is, StandardCharsets.UTF_8); ``` 從`JsonParserFactory`創建一個`JsonParser`。 ```java if (!parser.hasNext() && parser.next() != JsonParser.Event.START_ARRAY) { return; } ``` 首先,我們傳遞數組的開頭。 ```java // looping over object attributes while (parser.hasNext()) { var event = parser.next(); // starting object if (event == JsonParser.Event.START_OBJECT) { ... ``` 然后,我們在`while`循環中遍歷數組。 當我們到達數組末尾時,解析器的`hasNext()`方法返回`false`。 我們使用`next()`拉下一個解析事件。 ```java while (parser.hasNext()) { event = parser.next(); if (event == JsonParser.Event.KEY_NAME) { ... ``` 在另一個`while`循環中,我們遍歷當前對象的鍵。 ```java var key = parser.getString(); switch (key) { case "name": parser.next(); System.out.printf("Name: %s%n", parser.getString()); break; ... ``` 在`switch`語句中,我們檢查鍵名稱,并通過`getString()`獲得其值。 ```java Name: John Doe Occupation: gardener Born: 1992-03-02 Name: Brian Flemming Occupation: teacher Born: 1967-11-22 Name: Lucy Black Occupation: accountant Born: 1995-04-07 Name: William Bean Occupation: pilot Born: 1977-10-31 ``` 這是輸出。 在第二個示例中,我們連接到網站并從路徑獲取 JSON 數據。 `JsonParserEx.java` ```java package com.zetcode; import javax.json.Json; import javax.json.stream.JsonParser; import java.io.IOException; import java.net.URL; public class JsonParserEx { public static void main(String[] args) throws IOException { var url = new URL("https://jsonplaceholder.typicode.com/posts"); try (var in = url.openStream(); var parser = Json.createParser(in)) { // starting array parser.next(); while (parser.hasNext()) { // starting object var event1 = parser.next(); if (event1 == JsonParser.Event.START_OBJECT) { while (parser.hasNext()) { var event = parser.next(); if (event == JsonParser.Event.KEY_NAME) { switch (parser.getString()) { case "userId": parser.next(); System.out.printf("User Id: %d%n", parser.getInt()); break; case "id": parser.next(); System.out.printf("Post Id: %d%n", parser.getInt()); break; case "title": parser.next(); System.out.printf("Post title: %s%n", parser.getString()); break; case "body": parser.next(); System.out.printf("Post body: %s%n%n", parser.getString()); break; } } } } } } } } ``` 該示例處理了 jsonplaceholder.typicode.com 網站上的一百個帖子,該網站是用于測試和原型制作的虛假在線 REST API。 ## JSON-P `JsonGenerator` `JsonGenerator`以流方式將 JSON 數據寫入輸出源。 `JsonGeneratorFactory`包含創建`JsonGenerator`實例的方法。 `JsonGeneratorEx.java` ```java package com.zetcode; import javax.json.Json; import javax.json.stream.JsonGenerator; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.time.LocalDate; import java.util.HashMap; import java.util.List; public class JsonGeneratorEx { public static void main(String[] args) throws IOException { var myPath = Paths.get("src/main/resources/users.json"); var config = new HashMap<String, Boolean>(); config.put(JsonGenerator.PRETTY_PRINTING, true); var factory = Json.createGeneratorFactory(config); var generator = factory.createGenerator(Files.newBufferedWriter(myPath, StandardCharsets.UTF_8)); generator.writeStartArray(); var users = generateUsers(); users.forEach(user -> { generator.writeStartObject(); generator.write("name", user.getName()); generator.write("occupation", user.getOccupation()); generator.write("born", user.getBorn().toString()); generator.writeEnd(); }); generator.writeEnd(); generator.flush(); } public static List<User> generateUsers() { var born1 = LocalDate.of(1992, 3, 2); var u1 = new User("John Doe", "gardener", born1); var born2 = LocalDate.of(1967, 11, 22); var u2 = new User("Brian Flemming", "teacher", born2); var born3 = LocalDate.of(1995, 4, 7); var u3 = new User("Lucy Black", "accountant", born3); var born4 = LocalDate.of(1977, 10, 31); var u4 = new User("William Bean", "pilot", born4); return List.of(u1, u2, u3, u4); } } ``` 該示例從用戶列表創建`users.json`文件。 ```java var myPath = Paths.get("src/main/resources/users.json"); var config = new HashMap<String, Boolean>(); config.put(JsonGenerator.PRETTY_PRINTING, true); var factory = Json.createGeneratorFactory(config); var generator = factory.createGenerator(Files.newBufferedWriter(myPath, StandardCharsets.UTF_8)); ``` 用`JsonGeneratorFactory`創建一個`JsonGenerator`。 工廠接收配置數據,從而可以進行漂亮的打印。 ```java generator.writeStartArray(); ``` 數組從`writeStartArray()`開始。 稍后以`writeEnd()`結束。 ```java users.forEach(user -> { generator.writeStartObject(); generator.write("name", user.getName()); generator.write("occupation", user.getOccupation()); generator.write("born", user.getBorn().toString()); generator.writeEnd(); }); ``` JSON 對象寫在`forEach`循環中。 JSON 對象以`writeStartObject()`開頭,以`writeEnd()`結束。 鍵/值對使用`write()`編寫。 ```java generator.flush(); ``` 使用`flush()`將數據從緩沖區刷新到數據源。 在本教程中,我們已經使用 Java JSON-P 讀寫了 JSON 文件。 您可能也對相關教程感興趣: [Gson 教程](/java/gson/), [Java DOM 教程](/java/dom/), [Java SAX 教程](/java/sax/)和或 [Java 教程](/lang/java/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看