Javaの文字列からJSONアレイ値を抽出するための実用的なガイド
非標準ソースから取得したログ出力または文字列データを処理する場合、JSONアレイ内のすべての値など、特定のJSON構造を抽出する必要があります。正規表現はテキストマッチングにおいて強力ですが、複雑なJSON構造の保守性と堅牢性が不十分であることがよくあります。この記事では、2つの主要な方法を紹介します。成熟したJSON解析ライブラリを使用し、特定のシナリオで手動抽出のために正規表現を使用します。
1. JSON解析ライブラリを使用することをお勧めします
JSONデータを処理する場合、最も推奨される堅牢な方法は、ジャクソン、GSONなどの特別なJSON解析ライブラリを使用することです。これらのライブラリは、ネストされた構造、脱出されたキャラクターなどを含むJSONの複雑さを処理し、タイプセーフ解析方法を提供し、開発作業を大幅に簡素化し、コードの保守性を向上させることができます。
1.1構造化されたデータ分析にPOJOを使用します
JSONデータの構造が事前に既知で比較的固定されている場合、JSON構造はJavaオブジェクト(Plain Old Javaオブジェクト、Pojo)を定義することでマッピングできます。これは、最も一般的で推奨される解析方法です。
サンプルJSONデータ:
{ 「価値」:[ 「ABC123」、 「def456」、 「xyz789」 ] }
対応するpojoの定義:
java.util.listをインポートします。 パブリッククラスmypojo { プライベートリスト<string>値; // constructor public mypojo(){} // getter パブリックリスト<string> getValues(){ 返品値。 } // setter public void setValues(list <string> values){ this.values = values; } @オーバーライド public string toString(){ "mypojo {"を返します "values ="値 '}'; } }</string></string></string>
解析にはジャクソンライブラリを使用します。
com.fasterxml.jackson.databind.objectmapperをインポートします。 com.fasterxml.jackson.databind.json.jsonmapperをインポートします。 java.util.listをインポートします。 パブリッククラスjsonpojoparser { public static void main(string [] args)スロー例外{ string jsonstr = "{\" values \ ":[\" abc123 \ "、\" def456 \ "、\" xyz789 \ "]}"; ObjectMapper Mapper = new JSonMapper(); mypojo pojo = mapper.readvalue(jsonst、mypojo.class); System.out.println( "抽出値:" pojo.getValues()); //出力:抽出値:[ABC123、DEF456、XYZ789] } }
Pojoメソッドを通じて、JSON文字列はJavaオブジェクトに直接偏ります。開発者は、クリアコードを使用して、通常のJavaオブジェクトを操作するなどのデータを取得できます。
1.2動的データの解析にはjsonnodeを使用します
JSON構造が固定されていない場合、またはデータの一部を抽出するだけで、JSON全体のPOJOを定義する必要がない場合、JSONをツリー(JSONNODE)に解析し、ノードパスを介してアクセスできます。
Jsonnodeの解析にはJackson Libraryを使用します。
com.fasterxml.jackson.core.type.typereferenceをインポートします。 com.fasterxml.jackson.databind.jsonnodeをインポートします。 com.fasterxml.jackson.databind.objectmapperをインポートします。 com.fasterxml.jackson.databind.json.jsonmapperをインポートします。 java.util.listをインポートします。 パブリッククラスjsonnodeparser { public static void main(string [] args)スロー例外{ string jsonstr = "{\" values \ ":[\" abc123 \ "、\" def456 \ "、\" xyz789 \ "]}"; ObjectMapper Mapper = new JSonMapper(); // json文字列にjsonnodeツリーに解析するjsonnode rootnode = mappper.readtree(jsonstr); //「値」という名前のノードを取得jsonnode valuesNode = rootnode.get( "values"); //値ノードのコンテンツをリストして<string> リスト値= mappper.readerfor(new typereference <list>>(){})。readvalue(valuesNode); System.out.println( "抽出値:"); values.foreach(system.out :: println); /* *出力: * ABC123 * def456 * XYZ789 */ } }</list></string>
このアプローチは、より大きな柔軟性を提供し、構造が可変的であるか、部分的なデータのみが必要なシナリオを処理するのに適しています。
2。正規表現による手動抽出
ランタイム環境が厳密に制限されている場合、サードパーティライブラリを導入できない場合、または非常にシンプルで非常に一貫したフォーマットされた文字列から特定のフラグメントを抽出する必要がある場合など、まれな場合には、通常の表現を考慮することができます。ただし、JSONの複雑さ(ネスティング、脱出されたキャラクター、異なるデータ型など)のサポートを欠くJSONを処理するための理想的なツールではないことに注意することが重要です。
2.1該当するシナリオと制限
- 適用可能なシナリオ:文字列に含まれるJSONフラグメントは非常にシンプルで、固定構造があり、最も外側の配列の値のみを抽出する必要があります。たとえば、フォーム{"values":["a"、 "b"、 "c"]でログからフラグメントを抽出します。
- 制限:ネストされたJSON、JSONオブジェクト、さまざまなデータ型(数字、ブール値など)を処理できません。特殊文字または脱出された文字を含む文字列。正規表現は、わずかに複雑または厳しいJSONで失敗する傾向があります。
2.2正規表現戦略の改善
正規表現\ "VALUES \" \ s*:\ s*\ [(\ s*\ "(\ w)\" \ s*、?)*]は、元の質問で試みました。すべての値を取得するには、配列全体の内容をキャプチャし、キャプチャされたコンテンツで2次処理を実行する必要があります。
改善された正規表現: 「値」\ s*:\ s*\ [(。)]
この正規表現のアイデアは次のとおりです。
- 「値」\ s*:\ s*\ [:「値」を一致させる:[セクション、\ s*はゼロ以上のスペースと一致します。
- (。):これは使用するキャプチャグループです。任意のキャラクター(ラインブレークを除く)を1回以上一致させる。遭遇するまで、できるだけ多くの回数と一致します]。これにより、「ABC123」、「DEF456」、「XYZ789」など、アレイ全体の内部の文字列コンテンツがキャプチャされます。
- ]:配列のエンドブラケットを一致させます。
Javaの実装:
java.util.arraysをインポートします。 java.util.listをインポートします。 java.util.regex.matcherをインポートします。 java.util.regex.patternをインポートします。 java.util.stream.collectorsをインポートします。 パブリッククラスregexjsonarrayextractor { private static string source(){ string s = "{\" values \ ":[\ n" "\" abc123 \ "、\" def456 \ "、" "\" xyz789 \ "] \ n" "}"; s; } public static void main(string [] args){ 文字列jsonstr = source(); //これはログから取得したJSON文字列であると仮定します//ステップ1:正規表現を使用して配列パターン全体の内容をキャプチャします1 = pattern.compile( "\" values \ "\\ s*:\\ s*\\ [(。)]"); matcher matcher = pattern1.matcher(jsonstr); list <string> values = list.of(); //空のリストに初期化if(matcher.find()){ // matcher.group(1)には、アレイ全体の内部に文字列が含まれます。たとえば、 "abc123"、 "def456"、 "xyz789" string arraycontent = matcher.group(1); //ステップ2:キャプチャされた配列コンテンツ値= array.stream(arraycontent.split( "、"))// commas.map(s-> s.replaceall( "\" "、").strip().Strip()// quotesを削除し、blanks.collect(collectors.tolist())を削除します。 } System.out.println( "正規表現によって抽出された値:"); values.foreach(system.out :: println); /* *出力: * ABC123 * def456 * XYZ789 */ } }</string>
このメソッドは、まず正規表現を介してJSONアレイ内のすべての内容をキャプチャし、次にJavaの文字列処理関数(分割、交換、ストリップ)を使用して各値を抽出およびクリーンアップします。
2.3注意すべきこと
- 堅牢性が低い: JSON形式がわずかに変更された場合、この正規表現は無効になります(たとえば、値にはコンマ、引用、またはネストされた構造が含まれています)。
- メンテナンスコストの高い: JSON構造が変更された場合、正規表現とその後の文字列処理ロジックを変更する必要があります。これは、PojoまたはJSonnodeアクセスパスを変更するよりもはるかに複雑です。
- パフォーマンス:非常に大きな文字列の場合、頻繁に正規表現のマッチングと文字列操作がパフォーマンスに影響を与える可能性があります。
3。概要と提案
Javaの文字列からJSONアレイ値を抽出する場合、 JacksonやGSONなどの成熟したJSON解析ライブラリに優先順位を付けることを強くお勧めします。
- 構造固定JSONの場合: Pojoによる脱介入、タイプセーフ、高可読性、および維持の簡単なコードを提供します。
- 構造の動的または部分的なデータのみの場合:ツリー解析にJSonnodeを使用し、柔軟性とオンデマンドアクセスを提供します。
手動抽出は、JSON構造が非常にシンプルで、形式が非常に一貫しているシナリオでのみ考慮されます。この場合でも、その潜在的なメンテナンスコストと堅牢性のリスクを完全に評価する必要があります。適切なツールを選択すると、コードの信頼性、読みやすさ、将来の保守性を確保できます。
以上がJavaの文字列からJSONアレイ値を抽出するための実用的なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Stock Market GPT
AIを活用した投資調査により賢明な意思決定を実現

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

-CPパラメーターを使用してJARをClassPathに追加して、JVMがjava-cplibrary.jarcom.example.mainなどの内部クラスとリソースをロードできるようにします。

usefile.createNewfile()tocreatefileonlyifitdoes notexist、avolididingoverwriting;

実装キーワードを使用して、インターフェイスを実装します。クラスは、インターフェイス内のすべてのメソッドの特定の実装を提供する必要があります。複数のインターフェイスをサポートし、メソッドが公開されるようにコンマで区切られています。 Java 8の後のデフォルトおよび静的メソッドは、書き直す必要はありません。

Javaspiは、JDKに組み込みのサービス発見メカニズムであり、Serviceloaderを介してインターフェイス指向の動的拡張を実装しています。 1.サービスインターフェイスを定義し、Meta-INF/Services/の下のインターフェイスのフルネームに命名されたファイルを作成し、実装クラスの完全に適格な名前を記述します。 2。serviceloader.load()を使用して実装クラスをロードすると、JVMは自動的に構成を読み取り、インスタンス化します。 3.インターフェイス契約は、設計中に明確にし、優先順位と条件付き負荷をサポートし、デフォルトの実装を提供する必要があります。 4。アプリケーションシナリオには、マルチペイチャネルアクセスとプラグインの確認が含まれます。 5.パフォーマンス、クラスパス、例外分離、スレッドの安全性、バージョンの互換性に注意してください。 6。Java9では、Moduleシステムと組み合わせて提供できます。

この記事では、同じTCPソケットで複数のHTTP要求を送信するメカニズム、つまりHTTP Persistent Connection(Keep-Alive)を詳細に説明します。この記事では、HTTP/1.xとHTTP/2プロトコルの違いを明確にし、永続的な接続に対するサーバー側のサポートの重要性と、接続を正しく処理する方法:応答ヘッダーを閉じる方法を強調しています。一般的なエラーを分析し、ベストプラクティスを提供することにより、開発者が効率的で堅牢なHTTPクライアントを構築できるようにすることを目指しています。

javagenericsprovideCompile-timeTypeSafeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTyParaMetersonClasses、interfaces、and methods; wildcards(?、extendStype、?supertype)HeandnwondTypeswithFexibility.1.1.UnunboundCardCardCardCardCardCardCardCardCardCardCardの装備

プロパティクラスを使用して、Java構成ファイルを簡単に読み取ります。 1. config.propertiesをリソースディレクトリに入れ、getClassLoader()。getResourceasStream()を介してロードし、Load()メソッドを呼び出してデータベース構成を読み取ります。 2。ファイルが外部パスにある場合は、FileInputStreamを使用してロードします。 3. GetProperty(key、defaultValue)を使用して欠落しているキーを処理し、デフォルト値を提供して、例外処理と入力検証を確保します。

このチュートリアルでは、Javaに他のアレイリストを含むネストされたアレイリストを効率的に処理し、そのすべての内部要素を単一の配列にマージする方法を詳しく説明しています。この記事では、Java 8ストリームAPIのフラットマップ操作を通じて2つのコアソリューションを提供します。最初にリストにフラット化してから配列を埋め、さまざまなシナリオのニーズを満たすために新しい配列を直接作成します。
