4

JSON文字列があります:

{name:"X",age:{dob:"DD MMM",year:YYYY}}

Hashtable<String, String>次のようなペアが必要です。

name: "X"
age: {dob:"DD MMM",year:YYYY}

私は現在使用しています

string.substring(1,string.length() - 2).split(",");

正規表現を使用してこれを達成するにはどうすればよいですか?

4

3 に答える 3

6

説明

JSON テキストがサンプル テキストに示されているレベルを超えてネストされていない場合、この式は次のようになります。

  • 属性名を取得する
  • 属性値を取得する
  • 値の配列をまとめて保持し、トップレベルのみを返します

(?:,|\{)?([^:]*):("[^"]*"|\{[^}]*\}|[^},]*)

ここに画像の説明を入力

ライブデモ

サンプルテキスト

{name:"X",age:{dob:"DD MMM",year:YYYY}}

コード

String sourcestring = "source string to match with pattern";
Pattern re = Pattern.compile("(?:,|\\{)?([^:]*):(\"[^\"]*\"|\\{[^}]*\\}|[^},]*)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
Matcher m = re.matcher(sourcestring);

マッチ

[0][0] = {name:"X"
[0][1] = name
[0][2] = "X"

[1][0] = ,age:{dob:"DD MMM",year:YYYY}
[1][1] = age
[1][2] = {dob:"DD MMM",year:YYYY}
于 2013-07-28T03:31:02.183 に答える
3

4行ですべてを行う方法は次のとおりです。

Map<String, String> map = new HashMap<String, String>();
String[] parts = json.replaceAll("^\\{|\\}$","").split("\"?(:|,)(?![^\\{]*\\})\"?");
for (int i = 0; i < parts.length -1; i+=2)
    map.put(parts[i], parts[i+1]);

これは次のように機能します。

  1. 簡単に分割できないため、頭と尾のブレースは削除されています - それらはがらくたです
  2. 入力はコロンまたはコンマのいずれかで分割され、オプションで引用符が前/後に続きます (これにより引用符がきちんと消費されます)。 ただし、次の中括弧が右中括弧でない場合 (ネストされた用語ではないことを意味します) のみです。
  3. 分割結果を 2 ずつループし、名前と値のペアをマップに入れます。

ここにいくつかのテストコードがあります:

public static void main(String[] args) throws Exception {
    String json = "{name:\"X\",age:{dob:\"DD MMM\",year:YYYY}}";
    Map<String, String> map = new HashMap<String, String>();
    String[] parts = json.replaceAll("^\\{|\\}$","").split("\"?(:|,)(?![^\\{]*\\})\"?");
    for (int i = 0; i < parts.length -1; i+=2)
        map.put(parts[i], parts[i+1]);
    System.out.println(map.size() + " entries: " + map);
}

出力:

2 entries: {age={dob:"DD MMM",year:YYYY}, name=X}
于 2013-07-28T04:37:37.750 に答える
-3

これは再帰がサポートされている場合にのみ可能ですが、残念ながら Java にはありません。

再帰がサポートされている場合、次の正規表現がそれを行います。(?=({(?>[^{}]|(?1))+}))

ライブデモ: http://regex101.com/r/pH7rV8

于 2013-07-27T23:28:49.657 に答える