1

次のJSONを返すサードパーティのRESTfulWebサービスにアクセスしているJavaアプリがあります。

{"fizz":
    {"widgets":
        [
            {
                "widget_id":"295874"
            },
            {
                "widget_id":"295873"
            },
            {
                "widget_id":"295872"
            }
        ],
        "otime":1361993756
    },
    "resp":"ok"
}

通常、GSONまたはGensonを使用してこれをJava POJOにマップし直しますが、これを実行する必要があるのはコードの唯一の領域であり、ここで怠惰になりたいです;-)。

私は3つのwidget_id値(,および`) and returns them as aList`)を抽出する気の利いたメソッドを考え出そうとしています:

public List<Long> extractIdsFromJson(String json) {
    // Can I solve this with a regex perhaps?
}

正しいアプローチが何かわからない-正規表現、replaceAll、他の何か?前もって感謝します。

4

3 に答える 3

7

ここで怠けていると、長期的にはあなたを苦しめるだけです. JSON を解析し、その方法で値を抽出します。関連する「労力」が少なくなり、コードがより理解しやすくなり、将来のコード管理者があなたの名前を呪うことはありません。

于 2013-02-28T13:03:11.160 に答える
4
// untested
public List<Long> extractIdsFromJson(String json) {
    List<Long> list = new ArrayList<Long>();
    Matcher matcher = Pattern.compile("\"widget_id\":\"?(\\d+)\"?").matcher(json);
    while (matcher.find())
        list.add(Long.valueOf(matcher.group(1)));
    return list;
}
于 2013-02-28T13:04:54.617 に答える
3

怠惰が好きなら。これが解決策です。正規表現を使用して問題を解決するための選択を伴うものは何でも知っていることを願っています:

  • JSON の構造はチェックしません。JSON の形式が正しくない可能性があるという事実を無視して、やみくもにデータを抽出します。
  • Object値がorではないプロパティが必要なため、ここで機能しますArray

生の正規表現:

"widget_id"\s*:\s*"(\d+)"

リテラル文字列:

"\"widget_id\"\\s*:\\s*\"(\\d+)\""

上記の正規表現をMatcherループで使用します。

Pattern p = Pattern.compile("\"widget_id\"\\s*:\\s*\"(\\d+)\"");
Matcher m = p.matcher(inputString);

while (m.find()) {
    System.out.println(m.group(1));
} 
于 2013-02-28T13:04:11.090 に答える