亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
挑戰(zhàn):從JSON數(shù)組中提取獨立對象
核心解決方案:基於格式化特徵的正則表達式
正則表達式解析
Java實現(xiàn)示例
代碼解析
注意事項與替代方案
總結
首頁 Java java教程 Java中利用正則表達式高效提取JSON數(shù)組中的獨立對象

Java中利用正則表達式高效提取JSON數(shù)組中的獨立對象

Oct 16, 2025 pm 03:12 PM

Java中利用正則表達式高效提取JSON數(shù)組中的獨立對象

本文探討瞭如何使用Java的Pattern和Matcher配合正則表達式,從格式化的JSON數(shù)組字符串中精確提取出每個獨立的JSON對象字符串。文章詳細解析了核心正則表達式的工作原理及其對格式的依賴性,並提供了完整的Java代碼示例,同時強調了在實際應用中處理JSON的注意事項和更健壯的替代方案。

挑戰(zhàn):從JSON數(shù)組中提取獨立對象

在Java開發(fā)中,我們經常需要處理JSON數(shù)據(jù)。當面對一個包含多個JSON對象的數(shù)組字符串時,例如:

 [
    {
        "name": "User1",
        "gender": "M"
    },
    {
        "name": "User2",
        "gender": "F"
    }
]

我們的目標是將其解析成一個List,其中每個字符串代表一個獨立的JSON對象,如{"name":"User1","gender":"M"}。直接使用String.split("},")等方法往往不可靠,因為JSON對象內部可能包含嵌套的結構或包含}字符的字符串值,導致錯誤的分割。因此,我們需要一個更精確的方法,特別是當JSON數(shù)據(jù)具有一致的格式化(如縮進)時。

核心解決方案:基於格式化特徵的正則表達式

針對上述格式化的JSON數(shù)組,我們可以利用Java的正則表達式引擎來精準匹配並提取每個對象。關鍵在於構建一個能夠識別對象起始和結束邊界的正則表達式,並結合Java的Pattern和Matcher API。

正則表達式解析

我們使用的核心正則表達式是:(?sm)(?

  • (?sm): 這是兩個模式修飾符的組合:
    • s (DOTALL模式): 使.(點號)匹配包括換行符在內的所有字符。這對於匹配跨越多行的JSON對象至關重要。
    • m (MULTILINE模式): 使^(行首)和$(行尾)匹配每一行的開始和結束,而不僅僅是整個字符串的開始和結束。
  • (?
  • \{: 匹配字面量字符{,表示JSON對象的開始。
  • .*?: 匹配任意字符(包括換行符,因為s模式),非貪婪地匹配。這意味著它會盡可能少地匹配,直到遇到下一個匹配模式。
  • (?
  • \}: 匹配字面量字符},表示JSON對象的結束。

這個正則表達式非常依賴於輸入JSON字符串的特定格式化,即每個JSON對像都以{開頭,並且其閉合括號}也位於` `縮進的行首。

Java實現(xiàn)示例

以下是使用Java代碼實現(xiàn)JSON對象提取的完整示例:

 import java.util.List;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
import static java.util.stream.Collectors.toList;

public class JsonObjectExtractor {

    public static void main(String[] args) {
        String inputJson = "[\n"  
                " {\n"  
                " \"name\": \"User1\",\n"  
                " \"gender\": \"M\"\n"  
                " },\n"  
                " {\n"  
                " \"name\": \"User2\",\n"  
                " \"gender\": \"F\"\n"  
                " }\n"  
                "]";

        // 編譯正則表達式Pattern pattern = Pattern.compile("(?sm)(? jsonObjects = pattern.matcher(inputJson)
                .results() // 獲取所有匹配結果流.map(MatchResult::group) // 提取每個匹配到的完整字符串// 進一步處理:移除對象內部多餘的空白和換行符,使其更緊湊.map(str -> str.replaceAll("[\s\n]*(?!\",)", ""))
                .collect(toList()); // 收集到List中// 打印提取出的JSON對象jsonObjects.forEach(System.out::println);
    }
}

輸出結果:

 {"name":"User1","gender":"M"}
{"name":"User2","gender":"F"}

代碼解析

  1. * `Pattern.compile("(?sm)(? ?(?
  2. pattern.matcher(inputJson) : 創(chuàng)建一個Matcher對象,用於在inputJson字符串中查找匹配項。
  3. .results() : 返回一個Stream,其中包含所有非重疊的匹配結果。
  4. .map(MatchResult::group) : 對流中的每個MatchResult,調用group()方法來獲取實際匹配到的字符串(即完整的JSON對象字符串)。
  5. * `.map(str -> str.replaceAll("[\s\n] (?!\",)", ""))**: 這一步是對提取出的JSON對象字符串進行後處理。它使用另一個正則表達式來移除對象內部多餘的空白字符和換行符,從而將格式化的JSON對象轉換為更緊湊的單行形式。[\s\n]*匹配任意空白字符或換行符,而(?!\",)是一個負向先行斷言,確保不會移除緊跟在雙引號和逗號(",`)之後的空白,這有助於避免破壞JSON字符串內部的結構或值。
  6. .collect(toList()) : 將處理後的字符串流收集到一個List中。

注意事項與替代方案

  • 對格式的嚴格依賴性:本教程中使用的正則表達式高度依賴於輸入JSON的精確格式化(例如,4個空格的縮進)。如果JSON的格式發(fā)生變化(例如,使用Tab縮進、不同數(shù)量的空格,或者JSON本身是緊湊格式),則此正則表達式將失效。
  • 正則表達式的局限性:儘管正則表達式在文本模式匹配方面非常強大,但它並非處理複雜、嵌套JSON結構的理想工具。 JSON是一種具有嚴格語法規(guī)則的數(shù)據(jù)格式,包含嵌套對象、數(shù)組、轉義字符等,僅憑正則表達式很難健壯地解析所有有效JSON。
  • 推薦的健壯方案:對於任何非trivial的JSON解析任務,強烈建議使用專門的JSON解析庫,如:
    • Jackson : Java中最流行的JSON庫之一,功能強大,性能優(yōu)異。
    • Gson : Google提供的JSON庫,API簡潔易用。
    • JSON-P (Jakarta JSON Processing) : Java EE/Jakarta EE標準的一部分,提供了標準化的JSON處理API。 這些庫能夠正確處理JSON的各種複雜性,包括轉義字符、不同數(shù)據(jù)類型、嵌套結構等,並且提供了方便的API將JSON數(shù)據(jù)直接映射到Java對象,極大地簡化了開發(fā)工作。

總結

本文展示了在特定場景下,如何利用Java的正則表達式功能從格式化的JSON數(shù)組字符串中提取獨立的JSON對象。通過精確的正則表達式(?sm)(?

以上是Java中利用正則表達式高效提取JSON數(shù)組中的獨立對象的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Stock Market GPT

Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

如何在Java中的類Path中添加JAR文件? 如何在Java中的類Path中添加JAR文件? Sep 21, 2025 am 05:09 AM

使用-cp參數(shù)可將JAR加入類路徑,使JVM能加載其內類與資源,如java-cplibrary.jarcom.example.Main,支持多JAR用分號或冒號分隔,也可通過CLASSPATH環(huán)境變量或MANIFEST.MF配置。

如何在Java中創(chuàng)建文件 如何在Java中創(chuàng)建文件 Sep 21, 2025 am 03:54 AM

UseFile.createNewFile()tocreateafileonlyifitdoesn’texist,avoidingoverwriting;2.PreferFiles.createFile()fromNIO.2formodern,safefilecreationthatfailsifthefileexists;3.UseFileWriterorPrintWriterwhencreatingandimmediatelywritingcontent,withFileWriterover

使用Java服務提供商界面(SPI)構建可擴展應用程序 使用Java服務提供商界面(SPI)構建可擴展應用程序 Sep 21, 2025 am 03:50 AM

JavaSPI是JDK內置的服務發(fā)現(xiàn)機制,通過ServiceLoader實現(xiàn)面向接口的動態(tài)擴展。 1.定義服務接口並在META-INF/services/下創(chuàng)建以接口全名為名的文件,寫入實現(xiàn)類全限定名;2.使用ServiceLoader.load()加載實現(xiàn)類,JVM會自動讀取配置並實例化;3.設計時應明確接口契約、支持優(yōu)先級與條件加載、提供默認實現(xiàn);4.應用場景包括多支付渠道接入和插件化校驗器;5.注意性能、類路徑、異常隔離、線程安全和版本兼容性;6.在Java9 可結合模塊系統(tǒng)使用provid

如何在Java中實現(xiàn)接口? 如何在Java中實現(xiàn)接口? Sep 18, 2025 am 05:31 AM

使用implements關鍵字實現(xiàn)接口,類需提供接口中所有方法的具體實現(xiàn),支持多接口時用逗號分隔,確保方法為public,Java8後默認和靜態(tài)方法無需重寫。

了解Java仿製藥和通配符 了解Java仿製藥和通配符 Sep 20, 2025 am 01:58 AM

Javagenericsprovidecompile-timetypesafetyandeliminatecastingbyallowingtypeparametersonclasses,interfaces,andmethods;wildcards(?,?extendsType,?superType)handleunknowntypeswithflexibility.1.UseunboundedwildcardwhentypeisirrelevantandonlyreadingasObject

深入理解HTTP持久連接:在同一Socket上發(fā)送多個請求的策略與實踐 深入理解HTTP持久連接:在同一Socket上發(fā)送多個請求的策略與實踐 Sep 21, 2025 pm 01:51 PM

本文深入探討了在同一TCP Socket上發(fā)送多個HTTP請求的機制,即HTTP持久連接(Keep-Alive)。文章澄清了HTTP/1.x與HTTP/2協(xié)議的區(qū)別,強調了服務器端對持久連接支持的重要性,以及如何正確處理Connection: close響應頭。通過分析常見錯誤和提供最佳實踐,旨在幫助開發(fā)者構建高效且健壯的HTTP客戶端。

Java教程:如何扁平化嵌套ArrayList並將其元素填充到數(shù)組中 Java教程:如何扁平化嵌套ArrayList並將其元素填充到數(shù)組中 Sep 18, 2025 am 07:24 AM

本教程詳細介紹了在Java中如何高效地處理包含其他ArrayList的嵌套ArrayList,並將其所有內部元素合併到一個單一的數(shù)組中。文章將通過Java 8 Stream API的flatMap操作,提供兩種核心解決方案:先扁平化為列表再填充數(shù)組,以及直接創(chuàng)建新數(shù)組,以滿足不同場景的需求。

如何在Java中獲取通話方法的名稱? 如何在Java中獲取通話方法的名稱? Sep 24, 2025 am 06:41 AM

答案是使用Thread.currentThread().getStackTrace()獲取調用方法名,通過索引2得到調用anotherMethod的someMethod名稱,因索引0為getStackTrace、1為當前方法、2為調用者,示例輸出“Calledbymethod:someMethod”,也可用Throwable實現(xiàn),但需注意性能、混淆、安全及內聯(lián)影響。

See all articles