JSONからJavaクラスを生成しますか?


215

Java Mavenプロジェクトでは、JSONからJavaソースファイルをどのように生成しますか?たとえば、

{
  "firstName": "John",  
  "lastName": "Smith",  
  "address": {  
    "streetAddress": "21 2nd Street",  
     "city": "New York"
  }
}

実行mvn generate-sourcesすると、次のようなものが生成されます。

class Address  {
    JSONObject mInternalJSONObject;

    Address (JSONObject json){
        mInternalJSONObject = json;
    }

    String  getStreetAddress () {
        return mInternalJSONObject.getString("streetAddress");
    }

    String  getCity (){
        return mInternalJSONObject.getString("city");
    }
}

class Person {        
    JSONObject mInternalJSONObject;

    Person (JSONObject json){
        mInternalJSONObject = json;
    }

    String  getFirstName () {
        return mInternalJSONObject.getString("firstName");
    }

    String  getLastName (){
        return mInternalJSONObject.getString("lastName");
    }

    Address getAddress (){
        return Address(mInternalJSONObject.getString("address"));
    }
}

Java開発者として、pom.xmlこれを実現するためにどの行のXMLを記述する必要がありますか?


質問と回答を更新し、話題にしています。もう一度開いてください。
Alex R

回答:


269

jsonschema2pojoプラグインを試してください:

        <plugin>
            <groupId>org.jsonschema2pojo</groupId>
            <artifactId>jsonschema2pojo-maven-plugin</artifactId>
            <version>1.0.2</version>
            <configuration>
                <sourceDirectory>${basedir}/src/main/resources/schemas</sourceDirectory>
                <targetPackage>com.myproject.jsonschemas</targetPackage>
                <sourceType>json</sourceType>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

<sourceType>json</sourceType>ソースは(OP等)JSONである場合をカバーします。実際のJSON スキーマがある場合は、この行を削除します。

2020年に更新。この質問が行われた2009年12月以降、2つのことが起こりました。

  • JSON Schemaの仕様では、たくさんの上に移動しました。まだドラフト段階(未完成)ですが、完成に近づいており、構造ルールを指定する実行可能なツールになっています

  • 私は最近、あなたの問題を解決することを特に目的とした新しいオープンソースプロジェクトjsonschema2pojoを始めました。jsonschema2pojoツールはjsonスキーマドキュメントを受け取り、DTOスタイルのJavaクラスを(.javaソースファイルの形式で)生成します。プロジェクトはまだ成熟していませんが、jsonスキーマの最も有用な部分をカバーしています。開発の推進に役立つユーザーからのフィードバックをもっと探しています。現在、このツールはコマンドラインから、またはMavenプラグインとして使用できます。

お役に立てれば!


4
jsonschema2pojoツールを使用した誰かが独自のスキーマファイルを作成する必要はないでしょうか。OPは、スキーマではなく、Jsonファイルから開始するように求めました。Json-> Schemaから行くための関連ツールはありますか?そのようなツールがあったとしても、それは推測を提供するだけであると思います。
Jeff Axelrod

3
バージョン0.3.3以降、プレーンな古いJSONを入力として使用できます:)
joelittlejohn

14
...そして、現在オンラインジェネレーターもあります:jsonschema2pojo.org
joelittlejohn

2
優れたツール。提供されたリンクには、サンプルJSONに貼り付け、ボタンをクリックしてJavaソースを取得できるオンラインツールが含まれています。
mbmast 2015年

1
@testerjoe Javaソースコードの場合は、はいjsonschema2pojoがこれを行い、Mavenプラグイン、Antタスク、Gradle拡張機能、CLIツール、Javaライブラリなどとして利用できます...
joelittlejohn

21

Jackson(そこで最も人気のあるライブラリ)を使用している場合は、

https://github.com/astav/JsonToJava

そのオープンソースと誰もが貢献できるはずです。

概要

提供されているサンプルjsonデータに基づいてスキーマを推定し、必要なJavaデータ構造を生成するJsonToJavaソースクラスファイルジェネレーター。

実際のコードを書く前に、まずチームでJsonを考えることを奨励します。

特徴

  • 任意に複雑な階層のクラスを(再帰的に)生成できます
  • 既存のJavaクラスを読み取ることができ、それらの構造に逆シリアル化できる場合は、そうします
  • あいまいなケースが存在する場合、ユーザー入力を求めます

13

ネストされたオブジェクトまたはオブジェクトのネストされた配列を含むJSONを取得し、Jacksonアノテーションを使用してJavaソースを生成するオンラインツールを次に示します


1
これは、私にとって最初は非常にうまくいきました。私はJSONを深く入れ子にしていましたが、全体のサイズを2k未満にするには冗長な部分をトリミングする必要がありましたが、うまくいきました。私が書くことを可能にした:MyClass c = new MyClass(); c = gson.fromJson(c.getHTML(someURLthatReturnsJSON)、MyClass.class); 結果のデータは完全に流れました。私はこれらすべてのジャクソン表記を削除する必要がありましたが、それ以外の場合はgsonで正常に機能しました。ありがとうございました。
noogrub

ありがとう、うまくいきました。大文字と小文字を区別するフィールドを含むJSONをフィードすると、このサイトは結果を返しましたが、www.jsonschema2pojo.orgはエラーを報告しました。
CoolMind 2016

6

最近のプロジェクトでこの古い質問に答える;-)。

現在のところ、最善の解決策はおそらくJsonSchema2Pojoです。

めったに使用されないJsonスキーマからの仕事を行いますが、プレーンなJsonも使用します。AntとMavenプラグインを提供し、オンラインテストアプリケーションでツールのアイデアを得ることができます。私はJsonツイートを入れ、それを含むすべてのクラス(Tweet、User、Locationなど)を生成しました。

これをAgoravaプロジェクトで使用して、ソーシャルメディアマッピングを生成し、APIの絶え間ない進化を追跡します。


それも私の印象ですが、まだMavenプラグインを試していませんでしたが、オンラインバージョンはかなり遅く、通常のPersonクラス以外では何もできません...私。
Gregor

JsonSchema2Pojoを試しましたが、[プレビュー]ボタンをクリックすると、空白のプレビューがポップアップ表示されます。
AndroidDev 2016年

5

助けようとしたすべての人に感謝します。
私にとって、このスクリプトは役に立ちました。フラットなJSONのみを処理し、型を処理しませんが、いくつかのルーチンを自動化します

  String str = 
        "{"
            + "'title': 'Computing and Information systems',"
            + "'id' : 1,"
            + "'children' : 'true',"
            + "'groups' : [{"
                + "'title' : 'Level one CIS',"
                + "'id' : 2,"
                + "'children' : 'true',"
                + "'groups' : [{"
                    + "'title' : 'Intro To Computing and Internet',"
                    + "'id' : 3,"
                    + "'children': 'false',"
                    + "'groups':[]"
                + "}]" 
            + "}]"
        + "}";



    JSONObject json = new JSONObject(str);
    Iterator<String> iterator =  json.keys();

    System.out.println("Fields:");
    while (iterator.hasNext() ){
       System.out.println(String.format("public String %s;", iterator.next()));
    }

    System.out.println("public void Parse (String str){");
    System.out.println("JSONObject json = new JSONObject(str);");

    iterator  = json.keys();
    while (iterator.hasNext() ){
       String key = iterator.next();
       System.out.println(String.format("this.%s = json.getString(\"%s\");",key,key ));

    System.out.println("}");

5

これは古い質問であることは承知していますが、自分で答えを見つけようとしているときに偶然見つけました。

オンラインのjson-pojoジェネレーター(jsongen)についての回答は良いですが、コマンドラインで実行してさらに調整できるものが必要でした。

そのため、サンプルのJSONファイルを取得してPOJOを生成する非常にハッキーなRubyスクリプトを記述しました。これにはいくつかの制限があります(たとえば、Javaの予約済みキーワードに一致するフィールドを処理しません)が、多くの場合は十分です。

生成されたコードはデフォルトで、Jacksonで使用するために注釈を付けますが、これはスイッチでオフにすることができます。

あなたはgithubでコードを見つけることができます:https//github.com/wotifgroup/json2pojo


2

私の知る限り、そのようなツールはありません。まだ。

主な理由は、XML(XMLスキーマがあり、XMLとPOJO定義の間に「xjc」などのツールで要求どおりの処理を行う)とは異なり、完全に機能するスキーマ言語がないためだと思います。JSONスキーマはありますが、実際の型定義(JSON構造に焦点を当てている)をほとんどサポートしていないため、Javaクラスを生成するのは難しいでしょう。しかし、おそらくまだ可能です。いくつかの命名規則が定義され、生成をサポートするために使用された場合。

ただし、これはかなり頻繁に要求されている(私がフォローしているJSONツールプロジェクトのメーリングリストで)ため、近い将来誰かがそのようなツールを書くと思います。

したがって、それ自体は悪い考えではないと思います(また、すべてのユースケースに適しているわけではなく、何をしたいかによって異なります)。



2

GSONライブラリを試すこともできます。その非常に強力で、コレクション、カスタムオブジェクトからJSONを作成でき、その逆も可能です。Apache License 2.0でリリースされているため、商用でも使用できます。

http://code.google.com/p/google-gson/


13
はJava定義を作成しません
ネクロマンサー2013

3
これは問題に関するものではありません
ホップ


0

@japherの投稿に追加します。特にJSONに縛られていない場合は、プロトコルバッファをチェックする価値があります。


1
プロトコルバッファは、JSONからJavaオブジェクトを作成する方法についての回答にもほど遠いものです。少なくとも、プロトコルバッファからJavaオブジェクトを作成するためのツールを推奨しているはずです。
james.garriss 2014年

0

私の解決策を試してください

http://htmlpreview.github.io/?https://raw.githubusercontent.com/foobnix/android-universal-utils/master/json/generator.html

{
    "auctionHouse": "sample string 1",
    "bidDate": "2014-05-30T08:20:38.5426521-04:00 ",
    "bidPrice": 3,
    "bidPrice1": 3.1,
    "isYear":true
}

結果Javaクラス

private String  auctionHouse;
private Date  bidDate;
private int  bidPrice;
private double  bidPrice1;
private boolean  isYear;

JSONObject get

auctionHouse = obj.getString("auctionHouse");
bidDate = obj.opt("bidDate");
bidPrice = obj.getInt("bidPrice");
bidPrice1 = obj.getDouble("bidPrice1");
isYear = obj.getBoolean("isYear");

JSONObject put

obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);

この答えはとても簡単に見えます。jsonから
pojoを

0

ツールの開発方法を紹介します。そうすることができます:

  1. ユーザーjavascript関数Json.parse()、jsオブジェクトへのjson transのような文字列を作成
  2. 次に、このオブジェクトを使用して、javabean形式を生成します。
  3. (1)値の型のマッピング、たとえば、文字列を理解する方法は日付型です。(2)loweser_caseからcamelCaseへ

私は問題を解決するツールを開発します。それはうまく設計され、より迅速です。私のgithubからコードを入手してください。

ここからそれを楽しんでください、私はそれをウェブサーバーに配備しました。

私はトップ2の回答の提案を試します.1つのWebを開くことができません.1つは私のツールよりも遅いです。私のツールをお楽しみください。


このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
アクローム2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.