48

JSONObjectを照会できるJavaライブラリがどこかに存在するかどうか疑問に思っていました。より詳細には、次のようなものを探しています:

String json = "{ data: { data2 : { value : 'hello'}}}";

...
// Somehow we managed to convert json to jsonObject
...

String result = jsonObject.getAsString("data.data2.value");

System.out.println(result);

出力として「こんにちは」が得られることを期待しています。

これまでのところ、私が見つけた最速の方法は Gson を使用することです。

jsonObject.getAsJsonObject("data").getAsJsonObject().get("data2").getAsJsonObject("value").getAsString();

実際に書いたり読んだりするのは簡単ではありません。もっと速いものはありますか?

4

6 に答える 6

48

思いがけず非常に興味深いプロジェクトを見つけました:JSONパス

JsonPathはJSONに対して、XPATHはXMLに対して、特定のドキュメントの一部を抽出する簡単な方法です。

このライブラリを使用すると、要求していることをさらに簡単に実行できます。その後、私の以前の提案:

String hello = JsonPath.read(json, "$.data.data2.value");

System.out.println(hello); //prints hello

これもお役に立てば幸いです。

于 2013-03-21T15:16:48.590 に答える
28

まったく同じではありませんが、Jackson には Gson に似たツリー モデル表現があります。

JsonNode root = objectMapper.readTree(jsonInput);
return root.get("data").get("data2").get("value").asText();

そのため、段階的にトラバースする必要があります。

編集(2015年8月)

実際には (Jackson 2.3 以降) Jackson を使用したJSON ポインター式がサポートされています。したがって、代わりに次を使用できます。

return root.at("/data/data2/value").asText();
于 2013-03-16T18:46:56.450 に答える
17

まず、JSON オブジェクト バインディングを検討することをお勧めします。

ただし、任意の JSON オブジェクトを取得し、説明した方法で処理したい場合は、Jackson JSON プロセッサと Apache のCommons Beanutilsを組み合わせることをお勧めします。

考え方は次のとおりです。Jackson はデフォルトですべての JSON をjava.util.Mapインスタンスとして処理しますが、Commons Beanutils は配列や Map サポートを含むオブジェクトのプロパティ アクセスを簡素化します。

したがって、次のように使用できます。

//actually it is a Map instance with maps-fields within
Object jsonObj = objectMapper.readValue(json, Object.class);

Object hello = PropertyUtils.getProperty(jsonObj, "data.data2.value")

System.out.println(hello); //prints hello
于 2013-03-15T10:38:31.643 に答える
1

仕方ないと思います。

Javaクラスを検討してください

class Student {
    Subject subject = new Subject();
}

class Subject {
    String name;
}

ここでサブジェクト名にアクセスしたい場合

Student stud = new Student();
stud.subject.name; 

name に直接アクセスすることはできません。その場合、正しいサブジェクト名を取得できません。ここみたいに:

jsonObject.getAsJsonObject("data")
          .getAsJsonObject()
          .get("data2")
          .getAsJsonObject("value")
          .getAsString();

Javaオブジェクトと同じように使用したい場合は、使用します

ClassName classObject = new Gson().fromJson(JsonString, ClassName.class);

ClassName には、jsonstring と一致するすべてのフィールドが必要です。jsonobject 内に jsonobject がある場合は、Student クラスと Subject クラスで行っているように、別のクラスを作成する必要があります。

于 2013-03-15T10:36:21.567 に答える