JavaでJSONを解析する方法


1049

次のJSONテキストがあります。どのように私はの値を取得し、それを解析することができpageNamepagePicpost_id、などを?

{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    },
    "posts": [
         {
              "post_id": "123456789012_123456789012",
              "actor_id": "1234567890",
              "picOfPersonWhoPosted": "http://example.com/photo.jpg",
              "nameOfPersonWhoPosted": "Jane Doe",
              "message": "Sounds cool. Can't wait to see it!",
              "likesCount": "2",
              "comments": [],
              "timeOfPost": "1234567890"
         }
    ]
}

7
javaの組み込みJSONライブラリはそうするための最も簡単な方法ですが、私の経験では、GSONはJSONを簡単にPOJOに解析するための最良のライブラリです。
Iman Akbari

16
これは、投票数が多く、保護された最初の質問です。その回答で最も混乱しました
Riyafa Abdul Hameed

6
@JaysonMinardは同意した。modの介入を求められました。これは本当に閉じられるべきです。質問が保護されている間は(間違って)最初はそうすることができないと思っていたので、保護を解除して自分の仕事をしました。MODを待つ間、低応答の回答などを防ぐために再保護しました。
Mena

4
Downvoteボタンのツールチップ- 「この質問には、任意の研究努力が表示されない」
ジャン=フランソワ・コルベット

6
この質問はMeta議論されています。
マークアメリー2018

回答:


753

org.jsonのライブラリを使用するのは簡単です。以下のサンプルコード:

import org.json.*;

String jsonString = ... ; //assign your JSON String here
JSONObject obj = new JSONObject(jsonString);
String pageName = obj.getJSONObject("pageInfo").getString("pageName");

JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++)
{
    String post_id = arr.getJSONObject(i).getString("post_id");
    ......
}

あなたはより多くの例を見つけるかもしれません:JavaでのJSONの解析

ダウンロード可能なjar:http : //mvnrepository.com/artifact/org.json/json


15
@StaxManに同意します。私はorg.jsonを試しましたが、それは恐ろしく面倒です。たとえば、標準のJavaコレクション型とは実際には連携しません。
ケンウィリアムズ

7
@StaxMan org.json見なくても簡単なJSON解析のために他のライブラリを選択します。これは、Douglas Crockford(JSON発見者)が作成した参照ライブラリーです。
Omar Al-Ithawi 2015年

31
@OmarIthawiそれはばかげています。これは、厄介なAPI、非効率的な実装による概念実証です。著者の可視性から品質を推定しようとするよりも、ライブラリを独自のメリットで検討するほうがよいと思います。10年前は町で唯一のゲームでしたが、それ以来、大きな進歩がありました。それはjson libsのStrutsのようなものです。
StaxMan 2015年

12
org.jsonは、最悪のjsonライブラリの1つです。選択する前に、利用可能なjsonライブラリの機能セットとパフォーマンスを確認する必要があります。以下は、JMHを使用してjackson、gson、org.json、gensonを比較したベンチマークです:github.com/fabienrenaud/java-json-benchmark。ジャクソンはここで明らかに勝者です。
fabien

4
ライセンスには、一般的に使用されるオープンソースライセンスは含まれず、著作権も保持されます。
Christian Vielma

536

例のために、Personだけのクラスがあると仮定しましょうname

private class Person {
    public String name;

    public Person(String name) {
        this.name = name;
    }
}

Google GSONMaven

オブジェクトのすばらしいJSONシリアライゼーション/デシリアライゼーションに関する私の個人的なお気に入り。

Gson g = new Gson();

Person person = g.fromJson("{\"name\": \"John\"}", Person.class);
System.out.println(person.name); //John

System.out.println(g.toJson(person)); // {"name":"John"}

更新

単一の属性を取得したい場合は、Googleライブラリでも簡単に行うことができます。

JsonObject jsonObject = new JsonParser().parse("{\"name\": \"John\"}").getAsJsonObject();

System.out.println(jsonObject.get("name").getAsString()); //John

Org.JSONMaven

オブジェクトの逆シリアル化は必要ないが、単に属性を取得する場合は、org.jsonを試すことができます(または上記のGSONの例を見てください!

JSONObject obj = new JSONObject("{\"name\": \"John\"}");

System.out.println(obj.getString("name")); //John

ジャクソンMaven

ObjectMapper mapper = new ObjectMapper();
Person user = mapper.readValue("{\"name\": \"John\"}", Person.class);

System.out.println(user.name); //John

16
いい答えです。マイナーな改善のための1つの提案:GSONとジャクソンの両方もJSONツリー表現の使用をサポートします(ジャクソンJsonNodeの場合、これらはsであり、GSONは同様のものです)。org.jsonが提供する唯一の方法に似ているため、スニペットを表示するのに適している場合があります。
StaxMan、2015年

言及する価値のある他の2つのライブラリ:(完全を
期して

3
@NeonWarge、なぜ?この答えは、JSON文字列とまったく同じフィールドを含むJavaクラスがすでに定義されていることを前提としているようです。これは非常に強い仮定です。
Andrea Lazzarotto

1
json-simpleとoracleのjsonpはひどく実行します:github.com/fabienrenaud/java-json-benchmarkパフォーマンスのために、jacksonまたはdsljsonを選択します。
fabien

GSONはroot以外のレベルのフィールドの動的フィルタリングをサポートしていません!
Gangnus

102
  1. JSONからJavaオブジェクトを作成したい場合、またはその逆の場合は、GSONまたはJACKSONのサードパーティjarなどを使用します。

    //from object to JSON 
    Gson gson = new Gson();
    gson.toJson(yourObject);
    
    // from JSON to object 
    yourObject o = gson.fromJson(JSONString,yourObject.class);
  2. しかし、JSON文字列を解析していくつかの値を取得するだけの場合(または最初からJSON文字列を作成してネットワーク経由で送信する場合)、JsonReader、JsonArray、JsonObjectなどを含むJaveEE jarを使用します。その実装をダウンロードすることもできます。 javax.jsonのような仕様。これら2つのjarを使用すると、jsonを解析して値を使用できます。

    これらのAPIは、実際にはXMLのDOM / SAX解析モデルに従います。

    Response response = request.get(); // REST call 
        JsonReader jsonReader = Json.createReader(new StringReader(response.readEntity(String.class)));
        JsonArray jsonArray = jsonReader.readArray();
        ListIterator l = jsonArray.listIterator();
        while ( l.hasNext() ) {
              JsonObject j = (JsonObject)l.next();
              JsonObject ciAttr = j.getJsonObject("ciAttributes");

4
@nondescript推測しなければならない場合、元の投稿者の質問に答えられないため、反対票が投じられたと言います。「必要なコードは何ですか?」賛成された回答はコードスニペットを提供しました。
jewbix.cube 2015

4
注:ジャクソンとGSONはどちらもツリースタイルおよび/またはマップ/リストのバインディングをサポートしているため、Java EE(javax.json)パッケージを使用する必要はありません。javax.jsonには、JacksonやGSON以外に提供できるものはほとんどありません。
StaxMan 2015年

JavaEEライブラリへのリンクを追加することをお勧めします。
バジルブルク2018年

72

クイックJSONパーサーは非常に単純で柔軟性があり、非常に高速でカスタマイズ可能です。それを試してみてください

特徴:

  • JSON仕様に準拠(RFC4627)
  • 高性能JSONパーサー
  • 柔軟で構成可能な解析手法をサポート
  • JSON階層のキー/値ペアの構成可能な検証
  • 使いやすい#非常に小さい設置面積
  • 開発者が使いやすく、例外を追跡しやすい
  • プラグイン可能なカスタム検証のサポート-検出されたときにカスタムバリデーターを構成することにより、キー/値を検証できます
  • 検証および非検証パーサーのサポート
  • クイックJSON検証パーサーを使用するための2種類の構成(JSON / XML)のサポート
  • JDK 1.5が必要
  • 外部ライブラリに依存しない
  • オブジェクトのシリアル化によるJSON生成のサポート
  • 解析プロセス中のコレクションタイプ選択のサポート

次のように使用できます。

JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);

3
javadocはありますか?
jboi 2013

24
このパッケージは、解析時に空の値を処理できません。例:..​​. "description": "" ...例外をスローします
Ivan

6
code.google.com/p/quick-json/issues/detail?id=11でこの問題(および他の多くの問題) を修正しました。著者が公式リリースで修正する時間を割いてくれることを願っています。
noamik 2014

8
リストされた機能のうち、他のオプションと比較してユニークなものはありません。そして、高性能の主張は何もサポートしていません。用とは異なり、複数のライブラリー(Gson、ジャクソン、Genson、ブーン)のようなベンチマークに含まれている成熟github.com/eishay/jvm-serializersgithub.com/novoj/JavaJsonPerformanceTestまたはdeveloper.com/lang/jscript/... - Iをこのライブラリがテストに含まれているのを見たり、広く使用されていると言及したりしていません。
StaxMan 2014年

26
このプロジェクトは死んでいるようで、中央のMavenリポジトリでホストされなくなったようです。
8bitjunkie 2015年

40

Google Gsonを使用できます

このライブラリを使用すると、同じJSON構造を持つモデルを作成するだけで済みます。次に、モデルが自動的に入力されます。変数をJSONキーとして呼び出すか、@SerializedName別の名前を使用場合は必要があります。

JSON

あなたの例から:

{
    "pageInfo": {
        "pageName": "abc",
        "pagePic": "http://example.com/content.jpg"
    }
    "posts": [
        {
            "post_id": "123456789012_123456789012",
            "actor_id": "1234567890",
            "picOfPersonWhoPosted": "http://example.com/photo.jpg",
            "nameOfPersonWhoPosted": "Jane Doe",
            "message": "Sounds cool. Can't wait to see it!",
            "likesCount": "2",
            "comments": [],
            "timeOfPost": "1234567890"
        }
    ]
}

型番

class MyModel {

    private PageInfo pageInfo;
    private ArrayList<Post> posts = new ArrayList<>();
}

class PageInfo {

    private String pageName;
    private String pagePic;
}

class Post {

    private String post_id;

    @SerializedName("actor_id") // <- example SerializedName
    private String actorId;

    private String picOfPersonWhoPosted;
    private String nameOfPersonWhoPosted;
    private String message;
    private String likesCount;
    private ArrayList<String> comments;
    private String timeOfPost;
}

解析中

これで、Gsonライブラリを使用して解析できます。

MyModel model = gson.fromJson(jsonString, MyModel.class);

Gradleインポート

ライブラリをアプリのGradleファイルにインポートすることを忘れないでください

implementation 'com.google.code.gson:gson:2.8.6' // or earlier versions

自動モデル生成

このようなオンラインツールを使用して、JSONからモデルを自動的に生成できます。


38

指定されたほとんどすべての回答では、対象のプロパティの値にアクセスする前に、JSONをJavaオブジェクトに完全に逆シリアル化する必要があります。このルートを使用しない別の方法は、JsonPATHを使用することです JSONのXPathのようなを使用し、JSONオブジェクトのトラバースを可能にすることです。

これは仕様であり、JayWayの優秀な人々が仕様のJava実装を作成しました。 。https //github.com/jayway/JsonPathをご覧ください。

したがって、基本的にそれを使用するには、プロジェクトに追加します。例:

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>${version}</version>
</dependency>

そして使用する:

String pageName = JsonPath.read(yourJsonString, "$.pageInfo.pageName");
String pagePic = JsonPath.read(yourJsonString, "$.pageInfo.pagePic");
String post_id = JsonPath.read(yourJsonString, "$.pagePosts[0].post_id");

等...

JSONを横断する他の方法の詳細については、JsonPath仕様のページを確認してください。


これは、特にJSONの読み取りと更新には非常に優れたライブラリですが、このライブラリに関するいくつかの既知の問題に注意してください。[1]を参照してください:github.com/json-path/JsonPath/issues/272 [2]:github.com/json-path/JsonPath/issues/375
papigee

38

A-説明

JSONライブラリーをPOJOPlain Old Java Object)インスタンスにバインドするために、Jacksonライブラリーを使用できます。POJOは、プライベートフィールドとパブリックゲッター/セッターメソッドのみを含むクラスです。ジャクソンは(リフレクションを使用して)メソッドをトラバースし、クラスのフィールド名がJSONオブジェクトのフィールド名と一致するように、JSONオブジェクトをPOJOインスタンスにマップします。

実際には複合オブジェクトであるJSONオブジェクトでは、メインオブジェクトは2つのサブオブジェクトで構成されます。したがって、POJOクラスは同じ階層を持つ必要があります。JSONオブジェクト全体をPageオブジェクトとして呼び出します。Pageオブジェクトは、PageInfoオブジェクトとPostで構成されますオブジェクト配列でます。

したがって、3つの異なるPOJOクラスを作成する必要があります。

  • ページクラス、PageInfoクラスとポストインスタンスの配列の複合
  • PageInfoクラス
  • 投稿クラス

私が使用した唯一のパッケージはJackson ObjectMapperです。

com.fasterxml.jackson.databind.ObjectMapper

必要な依存関係、jarファイルを以下にリストします。

  • jackson-core-2.5.1.jar
  • jackson-databind-2.5.1.jar
  • jackson-annotations-2.5.0.jar

必要なコードは次のとおりです。

B-メインPOJOクラス:ページ

package com.levo.jsonex.model;

public class Page {

    private PageInfo pageInfo;
    private Post[] posts;

    public PageInfo getPageInfo() {
        return pageInfo;
    }

    public void setPageInfo(PageInfo pageInfo) {
        this.pageInfo = pageInfo;
    }

    public Post[] getPosts() {
        return posts;
    }

    public void setPosts(Post[] posts) {
        this.posts = posts;
    }

}

C-子POJOクラス:PageInfo

package com.levo.jsonex.model;

public class PageInfo {

    private String pageName;
    private String pagePic;

    public String getPageName() {
        return pageName;
    }

    public void setPageName(String pageName) {
        this.pageName = pageName;
    }

    public String getPagePic() {
        return pagePic;
    }

    public void setPagePic(String pagePic) {
        this.pagePic = pagePic;
    }

}

D-子POJOクラス:投稿

package com.levo.jsonex.model;

public class Post {

    private String post_id;
    private String actor_id;
    private String picOfPersonWhoPosted;
    private String nameOfPersonWhoPosted;
    private String message;
    private int likesCount;
    private String[] comments;
    private int timeOfPost;

    public String getPost_id() {
        return post_id;
    }

    public void setPost_id(String post_id) {
        this.post_id = post_id;
    }

    public String getActor_id() {
        return actor_id;
    }

    public void setActor_id(String actor_id) {
        this.actor_id = actor_id;
    }

    public String getPicOfPersonWhoPosted() {
        return picOfPersonWhoPosted;
    }

    public void setPicOfPersonWhoPosted(String picOfPersonWhoPosted) {
        this.picOfPersonWhoPosted = picOfPersonWhoPosted;
    }

    public String getNameOfPersonWhoPosted() {
        return nameOfPersonWhoPosted;
    }

    public void setNameOfPersonWhoPosted(String nameOfPersonWhoPosted) {
        this.nameOfPersonWhoPosted = nameOfPersonWhoPosted;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getLikesCount() {
        return likesCount;
    }

    public void setLikesCount(int likesCount) {
        this.likesCount = likesCount;
    }

    public String[] getComments() {
        return comments;
    }

    public void setComments(String[] comments) {
        this.comments = comments;
    }

    public int getTimeOfPost() {
        return timeOfPost;
    }

    public void setTimeOfPost(int timeOfPost) {
        this.timeOfPost = timeOfPost;
    }

}

E-サンプルJSONファイル:sampleJSONFile.json

JSONサンプルをこのファイルにコピーして、プロジェクトフォルダーの下に配置しました。

{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    },
    "posts": [
         {
              "post_id": "123456789012_123456789012",
              "actor_id": "1234567890",
              "picOfPersonWhoPosted": "http://example.com/photo.jpg",
              "nameOfPersonWhoPosted": "Jane Doe",
              "message": "Sounds cool. Can't wait to see it!",
              "likesCount": "2",
              "comments": [],
              "timeOfPost": "1234567890"
         }
    ]
}

F-デモコード

package com.levo.jsonex;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.levo.jsonex.model.Page;
import com.levo.jsonex.model.PageInfo;
import com.levo.jsonex.model.Post;

public class JSONDemo {

    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();

        try {
            Page page = objectMapper.readValue(new File("sampleJSONFile.json"), Page.class);

            printParsedObject(page);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static void printParsedObject(Page page) {
        printPageInfo(page.getPageInfo());
        System.out.println();
        printPosts(page.getPosts());
    }

    private static void printPageInfo(PageInfo pageInfo) {
        System.out.println("Page Info;");
        System.out.println("**********");
        System.out.println("\tPage Name : " + pageInfo.getPageName());
        System.out.println("\tPage Pic  : " + pageInfo.getPagePic());
    }

    private static void printPosts(Post[] posts) {
        System.out.println("Page Posts;");
        System.out.println("**********");
        for(Post post : posts) {
            printPost(post);
        }
    }

    private static void printPost(Post post) {
        System.out.println("\tPost Id                   : " + post.getPost_id());
        System.out.println("\tActor Id                  : " + post.getActor_id());
        System.out.println("\tPic Of Person Who Posted  : " + post.getPicOfPersonWhoPosted());
        System.out.println("\tName Of Person Who Posted : " + post.getNameOfPersonWhoPosted());
        System.out.println("\tMessage                   : " + post.getMessage());
        System.out.println("\tLikes Count               : " + post.getLikesCount());
        System.out.println("\tComments                  : " + Arrays.toString(post.getComments()));
        System.out.println("\tTime Of Post              : " + post.getTimeOfPost());
    }

}

G-デモ出力

Page Info;
****(*****
    Page Name : abc
    Page Pic  : http://example.com/content.jpg
Page Posts;
**********
    Post Id                   : 123456789012_123456789012
    Actor Id                  : 1234567890
    Pic Of Person Who Posted  : http://example.com/photo.jpg
    Name Of Person Who Posted : Jane Doe
    Message                   : Sounds cool. Can't wait to see it!
    Likes Count               : 2
    Comments                  : []
    Time Of Post              : 1234567890

26

使用し、最小限の-jsonの非常に高速で使いやすいです。String objおよびStreamから解析できます。

サンプルデータ:

{
  "order": 4711,
  "items": [
    {
      "name": "NE555 Timer IC",
      "cat-id": "645723",
      "quantity": 10,
    },
    {
      "name": "LM358N OpAmp IC",
      "cat-id": "764525",
      "quantity": 2
    }
  ]
}

解析:

JsonObject object = Json.parse(input).asObject();
int orders = object.get("order").asInt();
JsonArray items = object.get("items").asArray();

JSONの作成:

JsonObject user = Json.object().add("name", "Sakib").add("age", 23);

Maven:

<dependency>
  <groupId>com.eclipsesource.minimal-json</groupId>
  <artifactId>minimal-json</artifactId>
  <version>0.9.4</version>
</dependency>

ポージョはどのように見えますか?
ジェシー

Pojoにはgsonを使用します。このライブラリはサポートしていません。
Sakib Sami 2017

22

ベストプラクティスは、まだ進行中の公式Java JSON APIを通過することであると私は信じています


7
私が返信してから、私はジャクソンを使い始めました。JSON逆シリアル化に最適なライブラリの1つだと思います。
Giovanni Botta 2014

2
なぜJSONPを再利用して、Paddingを使用したJSONとは異なる何かを意味するのですか?...
Chris Wesseling

@ChrisWesselingどういう意味ですか?
ジョバンニボッタ

「JSON処理用Java API(JSON-P)」は、リンク先のドキュメントのタイトルです。そして、私はJSONPが別の意味を持っていることを知っていたので、混乱しました。
クリスウェッセリング

1
@ChrisWesselingああ、混乱しています。それは彼らが仕様のために選んだものです。しかし、私が言ったように、私はジャクソンに直接行きます。
ジョバンニボッタ

22

まだ誰も言及していないため、ここにNashornを使用したソリューションの始まりがあります(Java 8のJavaScriptランタイム部分ですが、Java 11では非推奨です)。

解決

private static final String EXTRACTOR_SCRIPT =
    "var fun = function(raw) { " +
    "var json = JSON.parse(raw); " +
    "return [json.pageInfo.pageName, json.pageInfo.pagePic, json.posts[0].post_id];};";

public void run() throws ScriptException, NoSuchMethodException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    engine.eval(EXTRACTOR_SCRIPT);
    Invocable invocable = (Invocable) engine;
    JSObject result = (JSObject) invocable.invokeFunction("fun", JSON);
    result.values().forEach(e -> System.out.println(e));
}

性能比較

それぞれ20、20、100要素の3つの配列を含むJSONコンテンツを作成しました。3番目の配列から100個の要素を取得するだけです。次のJavaScript関数を使用して、エントリを解析して取得します。

var fun = function(raw) {JSON.parse(raw).entries};

Nashornを使用して通話を100万回実行すると、7.5〜7.8秒かかります

(JSObject) invocable.invokeFunction("fun", json);

org.json20〜21秒かかります

new JSONObject(JSON).getJSONArray("entries");

ジャクソンは6.5〜7秒かかります

mapper.readValue(JSON, Entries.class).getEntries();

この場合、JacksonはNashornよりもパフォーマンスが高く、Nashornはorg.jsonよりもパフォーマンスがはるかに優れています。Nashorn APIは、org.jsonやJacksonに比べて使いにくいです。要件によっては、JacksonとNashornの両方が実行可能なソリューションになる可能性があります。


1
単位「"」とは?インチじゃない?秒ですか?分?
Peter Mortensen、2018

1
@PeterMortensen秒を意味します。はっきりしないので変更します。レビューありがとうございます。
otonglet 2018

2
残念ながら、NashornはJava 11、JEP 335では非推奨です。
Mildner氏による2018年

1
Nashornが非推奨であることは知っていますが、依存関係が必要ないため、この回答が気に入りました。しかし、私は例に再加工にビットを持っていた:ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); engine.eval("var fun = function(raw) { return JSON.parse(raw); };"); Map<String, Object> json = (Map<String, Object>) ((Invocable) engine).invokeFunction("fun", jsonString);
kgibm

21

以下の例は、「jsonText」変数として表される、質問のテキストを読み取る方法を示しています。このソリューションは、Java EE7 javax.json API(他の回答のいくつかで言及されています)を使用します。別の回答として追加したのは、次のコードが、質問に示された値の一部に実際にアクセスする方法を示しているためです。このコードを実行するには、javax.json API実装が必要です。「インポート」ステートメントを宣言したくなかったので、必要な各クラスの完全なパッケージが含まれていました。

javax.json.JsonReader jr = 
    javax.json.Json.createReader(new StringReader(jsonText));
javax.json.JsonObject jo = jr.readObject();

//Read the page info.
javax.json.JsonObject pageInfo = jo.getJsonObject("pageInfo");
System.out.println(pageInfo.getString("pageName"));

//Read the posts.
javax.json.JsonArray posts = jo.getJsonArray("posts");
//Read the first post.
javax.json.JsonObject post = posts.getJsonObject(0);
//Read the post_id field.
String postId = post.getString("post_id");

さて、GSON、org.json、Jackson、またはその他の利用可能なサードパーティのフレームワークを使用していないため、誰もがこの回答に反対する前に、提供されたテキストを解析するための質問ごとの「必要なコード」の例です。現在の標準JSR 353への準拠はJDK 9では考慮されていなかったためJSR 353仕様は他のサードパーティのJSON処理実装と同じように扱う必要があることを私はよく知っています。


15

これは、それがいかに簡単かで私の心を吹き飛ばしました。StringJSONの保持をデフォルトのorg.jsonパッケージのJSONObjectのコンストラクターに渡すだけです。

JSONArray rootOfPage =  new JSONArray(JSONString);

できました。マイクを落とします。これも動作しJSONObjectsます。その後、オブジェクトのメソッドをObjects使用する階層をget()確認できます。


13
JSONArrayタイプは、J2SE JDKのAPIの一部ではなく、あなたは、このタイプを提供しているAPIまたはサードパーティのライブラリ言うことはありません。
Bobulous、2015

2
私がそれを使用することをお勧めするわけではありませんが、これはjson.org/javaの "org.json"パッケージを参照していると思います。(2008または前に)それは良いのJavaライブラリが使用可能になる前に使用するために使用されるが、これは数年前だった
StaxMan

1
あるいは、brainmurphy1はAndroidのJSONArrayを意味しますか?
アレクサンダーファーバー2018

12

Javaで利用できるJSONライブラリは多数あります。

最も悪名高いのは、Jackson、GSON、Genson、FastJson、org.jsonです。

ライブラリを選択する際には、通常、次の3つの点に注意する必要があります。

  1. パフォーマンス
  2. 使いやすさ(コードは簡単に記述でき、読みやすい)-機能に対応しています。
  3. モバイルアプリの場合:依存関係/ jarサイズ

特にJSONライブラリ(およびシリアル化/非シリアル化ライブラリ)の場合、データをパックまたはアンパックするためのボイラープレートコードを記述する必要がなくなるため、データバインディングも通常は重要です。

1については、次のベンチマークを参照してください。https//github.com/fabienrenaud/java-json-benchmark JMHを使用しました比較(ジャクソン、gson、genson、fastjson、org.json、JSONP)ストリームを使用してシリアライザとデシリアライザのパフォーマンスをおよびdatabind API。2については、インターネット上で多数の例を見つけることができます。上記のベンチマークは、例のソースとしても使用できます...

ベンチマークのクイックテイクアウト:ジャクソンは、org.jsonよりも5〜6倍、GSONよりも2倍以上優れたパフォーマンスを発揮します。

特定の例では、次のコードはjsonをjacksonでデコードします。

public class MyObj {

    private PageInfo pageInfo;
    private List<Post> posts;

    static final class PageInfo {
        private String pageName;
        private String pagePic;
    }

    static final class Post {
        private String post_id;
        @JsonProperty("actor_id");
        private String actorId;
        @JsonProperty("picOfPersonWhoPosted")
        private String pictureOfPoster;
        @JsonProperty("nameOfPersonWhoPosted")
        private String nameOfPoster;
        private String likesCount;
        private List<String> comments;
        private String timeOfPost;
    }

    private static final ObjectMapper JACKSON = new ObjectMapper();
    public static void main(String[] args) throws IOException {
        MyObj o = JACKSON.readValue(args[0], MyObj.class); // assumes args[0] contains your json payload provided in your question.
    }
}

ご不明な点がありましたらお知らせください。


11

他の回答に加えて、GSON、Jackson 1.x、Jackson 2.xのjsonまたはjsonスキーマからJavaクラスをすばやく生成するために、このオンラインオープンソースサービスjsonschema2pojo.orgをお勧めします。たとえば、次の場合:

{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    }
    "posts": [
         {
              "post_id": "123456789012_123456789012",
              "actor_id": 1234567890,
              "picOfPersonWhoPosted": "http://example.com/photo.jpg",
              "nameOfPersonWhoPosted": "Jane Doe",
              "message": "Sounds cool. Can't wait to see it!",
              "likesCount": 2,
              "comments": [],
              "timeOfPost": 1234567890
         }
    ]
}

jsonschema2pojo.org GSONのためには、生成されました:

@Generated("org.jsonschema2pojo")
public class Container {
    @SerializedName("pageInfo")
    @Expose
    public PageInfo pageInfo;
    @SerializedName("posts")
    @Expose
    public List<Post> posts = new ArrayList<Post>();
}

@Generated("org.jsonschema2pojo")
public class PageInfo {
    @SerializedName("pageName")
    @Expose
    public String pageName;
    @SerializedName("pagePic")
    @Expose
    public String pagePic;
}

@Generated("org.jsonschema2pojo")
public class Post {
    @SerializedName("post_id")
    @Expose
    public String postId;
    @SerializedName("actor_id")
    @Expose
    public long actorId;
    @SerializedName("picOfPersonWhoPosted")
    @Expose
    public String picOfPersonWhoPosted;
    @SerializedName("nameOfPersonWhoPosted")
    @Expose
    public String nameOfPersonWhoPosted;
    @SerializedName("message")
    @Expose
    public String message;
    @SerializedName("likesCount")
    @Expose
    public long likesCount;
    @SerializedName("comments")
    @Expose
    public List<Object> comments = new ArrayList<Object>();
    @SerializedName("timeOfPost")
    @Expose
    public long timeOfPost;
}

9

JSON文字列(jsonString)を表すJavaクラス(メッセージなど)がある場合、Jackson JSONライブラリを次のように使用できます。

Message message= new ObjectMapper().readValue(jsonString, Message.class);

メッセージオブジェクトから、任意の属性をフェッチできます。


9

Gsonは簡単に学習および実装できます。知っておくべきことは、次の2つの方法です。

  • toJson() – JavaオブジェクトをJSON形式に変換する

  • fromJson() – JSONをJavaオブジェクトに変換する

`

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import com.google.gson.Gson;

public class GsonExample {
    public static void main(String[] args) {

    Gson gson = new Gson();

    try {

        BufferedReader br = new BufferedReader(
            new FileReader("c:\\file.json"));

        //convert the json string back to object
        DataObject obj = gson.fromJson(br, DataObject.class);

        System.out.println(obj);

    } catch (IOException e) {
        e.printStackTrace();
    }

    }
}

`


Gsonの完全な知識については、以下のリンクを参照してください。 github.com/google/gson/blob/master/UserGuide.md
venkat

9

JSONコンテンツをオブジェクトに解析したり、JSON値を読み取るだけのオープンソースライブラリがたくさんあります。要件は、値を読み取ってカスタムオブジェクトに解析することだけです。したがって、org.jsonライブラリで十分です。

org.jsonライブラリを使用して解析し、JsonObjectを作成します。

JSONObject jsonObj = new JSONObject(<jsonStr>);

次に、このオブジェクトを使用して値を取得します。

String id = jsonObj.getString("pageInfo");

ここで完全な例を見ることができます:

JavaでJSONを解析する方法


すべての回答にそのサイトへのリンクが含まれているようです。スパムの場合は中止してください。そうでない場合は、混乱して申し訳ありませんが、すべての回答にリンクを投稿する必要はないと思います。
ドナルドダック

1
すべてのシナリオを説明できる答えを出すのは難しいです。この場合のように、json配列または複数のjsonオブジェクトを読み取る方法。私がそうしたとしても、答えは非常に長くなり、人は混乱するかもしれません。そこで、適切な例を挙げて、適切な説明が記載されているリンクを示します。彼は訪問するか、私の説明だけを使用するかを選択できます。
lalitbhagtani 2017

1
あなたが提供したリンクは、JSONの読み取り方法を示すだけのようです。JSONの方法に関する情報はどこにありますか?
Lampros Tzanetos 2017年

申し訳ありませんが、私はあなたの質問を理解できませんでした:-「JSONの使い方について」
lalitbhagtani

7

このようなことをしてください:

JSONParser jsonParser = new JSONParser();
JSONObject obj = (JSONObject) jsonParser.parse(contentString);
String product = (String) jsonObject.get("productId");

10
えっと、これはどの図書館ですか?
Stewart

2
彼はorg.json.simpleを使用していると思います
Lasitha Yapa

7

Gsonライブラリを使用して、JSON文字列を解析できます。

Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(jsonAsString, JsonObject.class);

String pageName = jsonObject.getAsJsonObject("pageInfo").get("pageName").getAsString();
String pagePic = jsonObject.getAsJsonObject("pageInfo").get("pagePic").getAsString();
String postId = jsonObject.getAsJsonArray("posts").get(0).getAsJsonObject().get("post_id").getAsString();

次のように、「posts」配列をループすることもできます。

JsonArray posts = jsonObject.getAsJsonArray("posts");
for (JsonElement post : posts) {
  String postId = post.getAsJsonObject().get("post_id").getAsString();
  //do something
}

5
{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    },
    "posts": [
         {
              "post_id": "123456789012_123456789012",
              "actor_id": "1234567890",
              "picOfPersonWhoPosted": "http://example.com/photo.jpg",
              "nameOfPersonWhoPosted": "Jane Doe",
              "message": "Sounds cool. Can't wait to see it!",
              "likesCount": "2",
              "comments": [],
              "timeOfPost": "1234567890"
         }
    ]
}

Java code :

JSONObject obj = new JSONObject(responsejsonobj);
String pageName = obj.getJSONObject("pageInfo").getString("pageName");

JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++)
{
    String post_id = arr.getJSONObject(i).getString("post_id");
    ......etc
}

9
コードのみの回答は、十分に文書化されたコードよりもはるかに少ない他者を助けるため、回答を説明してください。「人に魚を与え、あなたは彼に1日間餌を与える。人に釣りを教え、あなたは彼に一生餌を与える」を参照してください。
Wai Ha Lee

これは「org.json」ライブラリ用であることを述べておくとよいでしょう。しかし、これは非常に冗長であり、「org.json」lib自体が古くなっている(遅い、面倒なAPI)ため、これを行うのに良い方法だとは思いません。より良い選択があります:GSON、ジャクソン、ブーン、ゲンソンを使用します。
StaxMan 2015年

5

次のブログ投稿、JSON in Javaをお読みください。

この投稿は少し古いですが、それでもあなたの質問に答えたいと思います。

ステップ1:データのPOJOクラスを作成します。

ステップ2:JSONを使用してオブジェクトを作成します。

Employee employee = null;
ObjectMapper mapper = new ObjectMapper();
try{
    employee =  mapper.readValue(newFile("/home/sumit/employee.json"), Employee.class);
} 
catch (JsonGenerationException e){
    e.printStackTrace();
}

詳細については、次のリンクを参照してください


4

このページの上位の回答では、1つのプロパティを持つオブジェクト(例:{name:value})のような単純すぎる例を使用しています。まだシンプルだが実際の例は誰かを助けることができると思います。

したがって、これはGoogle Translate APIによって返されるJSONです。

{
  "data": 
     {
        "translations": 
          [
            {
              "translatedText": "Arbeit"
             }
          ]
     }
}

GoogleのGsonを使用して、「translatedText」属性の値(「Arbeit」など)を取得したい。

2つの可能なアプローチ:

  1. 必要な属性を1つだけ取得する

    String json  = callToTranslateApi("work", "de");
    JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
    return jsonObject.get("data").getAsJsonObject()
            .get("translations").getAsJsonArray()
            .get(0).getAsJsonObject()
            .get("translatedText").getAsString();
  2. JSONからJavaオブジェクトを作成する

    class ApiResponse {
        Data data;      
        class Data {
            Translation[] translations;         
            class Translation {
                String translatedText;
            }
         }
     }

    ...

     Gson g = new Gson();
     String json =callToTranslateApi("work", "de");
     ApiResponse response = g.fromJson(json, ApiResponse.class);
     return response.data.translations[0].translatedText;

4

まず、実装ライブラリを選択する必要があります

JSON処理用Java API(JSR 353)は、オブジェクトモデルとストリーミングAPIを使用してJSONを解析、生成、変換、クエリするためのポータブルAPIを提供します。

リファレンス実装はここにある:https://jsonp.java.net/

ここに、JSR 353 の実装リストがあります。

JSR-353(JSON)を実装するAPIは何ですか

そして、あなたが決めるのを助けるために ...私はこの記事も見つけました:

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/

ジャクソンを利用する場合は、ジャクソンを使用したJSONとJavaの間の変換についての良い記事があります:https : //www.mkyong.com/java/how-to-convert-java-object-to-from-json-ジャクソン/

それが役に立てば幸い!


Jacksonライブラリのバージョン1を指しています。現在のバージョンのジャクソンライブラリを使用することを強くお勧めします。
Herbert Yu

4

Jayway JsonPathを使用できます。以下は、ソースコード、pomの詳細、優れたドキュメントを含むGitHubリンクです。

https://github.com/jayway/JsonPath

以下の手順に従ってください。

ステップ1:Mavenを使用してクラスパスにjayway JSONパス依存関係を追加するか、JARファイルをダウンロードして手動で追加します。

<dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <version>2.2.0</version>
</dependency>

ステップ2:この例では、入力JSONをファイルとして保存してください。私の場合、JSONをsampleJson.txtとして保存しました。pageInfoと投稿の間のカンマを逃したことに注意してください。

ステップ3:bufferedReaderを使用して上記のファイルからJSONコンテンツを読み取り、Stringとして保存します。

BufferedReader br = new BufferedReader(new FileReader("D:\\sampleJson.txt"));

        StringBuilder sb = new StringBuilder();
        String line = br.readLine();

        while (line != null) {
            sb.append(line);
            sb.append(System.lineSeparator());
            line = br.readLine();
        }
        br.close();
        String jsonInput = sb.toString();

ステップ4:jayway JSONパーサーを使用してJSON文字列を解析します。

Object document = Configuration.defaultConfiguration().jsonProvider().parse(jsonInput);

ステップ5:以下のように詳細を読みます。

String pageName = JsonPath.read(document, "$.pageInfo.pageName");
String pagePic = JsonPath.read(document, "$.pageInfo.pagePic");
String post_id = JsonPath.read(document, "$.posts[0].post_id");

System.out.println("$.pageInfo.pageName " + pageName);
System.out.println("$.pageInfo.pagePic " + pagePic);
System.out.println("$.posts[0].post_id " + post_id);

出力は次のようになります

$.pageInfo.pageName = abc
$.pageInfo.pagePic = http://example.com/content.jpg
$.posts[0].post_id  = 123456789012_123456789012

3

私はこのようなJSONを持っています:

{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    }
}

Javaクラス

class PageInfo {

    private String pageName;
    private String pagePic;

    // Getters and setters
}

このJSONをJavaクラスに変換するためのコード。

    PageInfo pageInfo = JsonPath.parse(jsonString).read("$.pageInfo", PageInfo.class);

メイベン

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.2.0</version>
</dependency>

2

一つは使用することができますApacheの@Model注釈を作成するためのJavaの構造を表すモデルクラスのJSONファイルをし、様々な要素にアクセスするためにそれらを使用JSONの木。他のソリューションとは異なり、これは反射なしで完全に機能しますはため、リフレクションが不可能であるか、大きなオーバーヘッドが伴う環境に適しています。

あるサンプルMavenプロジェクトの使用を示すが。まず、構造を定義します。

@Model(className="RepositoryInfo", properties = {
    @Property(name = "id", type = int.class),
    @Property(name = "name", type = String.class),
    @Property(name = "owner", type = Owner.class),
    @Property(name = "private", type = boolean.class),
})
final class RepositoryCntrl {
    @Model(className = "Owner", properties = {
        @Property(name = "login", type = String.class)
    })
    static final class OwnerCntrl {
    }
}

次に、生成されたRepositoryInfoクラスとOwnerクラスを使用して、提供された入力ストリームを解析し、その間に特定の情報を取得します。

List<RepositoryInfo> repositories = new ArrayList<>();
try (InputStream is = initializeStream(args)) {
    Models.parse(CONTEXT, RepositoryInfo.class, is, repositories);
}

System.err.println("there is " + repositories.size() + " repositories");
repositories.stream().filter((repo) -> repo != null).forEach((repo) -> {
    System.err.println("repository " + repo.getName() + 
        " is owned by " + repo.getOwner().getLogin()
    );
})

それだ!それに加えて、非同期ネットワーク通信と同様の例を示すライブ要点があります。


2

jsoniter(jsoniterator)は、比較的新しくてシンプルなjsonライブラリで、シンプルで高速になるように設計されています。jsonデータをデシリアライズするために必要なのは

JsonIterator.deserialize(jsonData, int[].class);

どこ jsonData JSONデータの文字列です。

詳しくは公式サイトをご覧ください。


1

JSONObjectクラスを使用して、JSON文字列をJSONオブジェクトに変換し、JSONオブジェクトを反復処理できます。次のコードを使用します。

JSONObject jObj = new JSONObject(contents.trim());
Iterator<?> keys = jObj.keys();

while( keys.hasNext() ) {
  String key = (String)keys.next();
  if ( jObj.get(key) instanceof JSONObject ) {           
    System.out.println(jObj.getString(String key));
  }
}

2
これが唯一のアンドロイドである
ルボミール


1
@DermotCanniffeそれは単なるAndroidです。
user4020527

1

DSMストリーム解析ライブラリを使用して、複雑なjsonおよびXMLドキュメントを解析できます。DSMはデータを1回だけ解析し、すべてのデータをメモリにロードしません。

ページがあるとしましょう与えられたjsonデータをデシリアライズするクラス。

ページクラス

public class Page {
    private String pageName;
    private String pageImage;
    private List<Sting> postIds;

    // getter/setter

}

yamlマッピングファイルを作成します。

result:
  type: object     # result is array
  path: /posts
  fields:
    pageName:
        path: /pageInfo/pageName
    pageImage:
        path: /pageInfo/pagePic
    postIds:
      path: post_id
      type: array

DSMを使用してフィールドを抽出します。

DSM dsm=new DSMBuilder(new File("path-to-yaml-config.yaml")).create(Page.class);
Page page= (Page)dsm.toObject(new path-to-json-data.json");

jsonにシリアル化されたページ変数:

{
  "pageName" : "abc",
  "pageImage" : "http://example.com/content.jpg",
  "postIds" : [ "123456789012_123456789012" ]
}

DSMは、複雑なjsonおよびxmlに非常に適しています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.