JSON文字列をJava MEのオブジェクトに変換しますか?


116

次のような文字列を変換する方法がJava / J2MEにありますか?

{name:"MyNode", width:200, height:100}

同じの内部オブジェクト表現に、1行のコードで?

現在の方法は面倒すぎるので:

Object n = create("new");
setString(p, "name", "MyNode");
setInteger(p, "width", 200);
setInteger(p, "height", 100);

たぶんJSONライブラリ?


6
文字列は実際にはJsonオブジェクトではありません。Json標準を参照してください...これはJavaScript表記に似ています。
PhiLho 2009

19
@ジェレミー・ラッド:する必要があります{"name":"MyNode", "width":200, "height":100}
エステバンキューバー2009

1
@voyager:わかっていますが、JavaScriptは引用符なしのプロパティ名をネイティブでサポートしています。
2009

1
@PhiLho:私はそれを知っていますが、分かりやすくするためにこのように保ちました。SO構文ハイライターはそれを台無しにしていたでしょう。赤の名前と値。
TheFlash 2009

JavaのコアAPIを使用して変換を行う方法はありますか?おそらくJava 8では?Java 9?
AlikElzin-kilaka 2016年

回答:


108

それらのいくつかを使用し、私のお気に入りは、

http://code.google.com/p/json-simple/

ライブラリは非常に小さいため、J2MEに最適です。

このように1行でJSONをJavaオブジェクトに解析できます。

JSONObject json = (JSONObject)new JSONParser().parse("{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
System.out.println("name=" + json.get("name"));
System.out.println("width=" + json.get("width"));

1
このライブラリをアプレットで使用できますか?Reflectionを使用している場合、reflectpermissionエラーが発生します。それはうまくいくでしょうか?
Mridang Agarwalla

jsonSimpleにはJSONParserクラスがまだありますか?クラスを呼び出すことができません。
プウィン2016

JSONParserは非推奨になりました。
VardaElentári2017年

79

最も簡単なオプションはジャクソンです:

MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);

他にも同様に使用が簡単なライブラリーがあります(Gsonについてはすでに触れました)。ただし、元のorg.jsonライブラリのように、いくつかの選択はより面倒です。そのため、必要がない場合でも中間の「JSONObject」を作成する必要があります。


ジャクソンはJ2MEをサポートしていません
2012


1
upticksは2つしかありませんが、それ以上の価値があります。ジャクソンは私たちのアプリにプラグインするのは本当に簡単でした。推薦してくれてありがとう。
Dan Doyon 2013年

1
ジャクソンは、単純なオブジェクトに逆シリアル化することもできます。例えば。Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye 14

Jacksonを使用したその他のコード例: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo

61

GSONは、javaオブジェクトをjsonオブジェクトに、またはその逆に変換するのに適したオプションです。
googleが提供するツールです。

jsonをjavaオブジェクトの使用fromJson(jsonObject,javaclassname.class)
に変換する場合:javaオブジェクトをjsonオブジェクトの使用に変換する場合:toJson(javaObject)
残りは自動的に行われます

詳細とダウンロード


1
+1私は似たようなものを探していましたが、これは法案にぴったりです!
Roy Tang

23

これは、Google GSONで簡単に実行できます。

たとえば、user、width、heightのフィールドを持つUserというクラスがあり、次のjson文字列をUserオブジェクトに変換するとします。

{"name":"MyNode", "width":200, "height":100}

次のコードを使用すると、キャストする必要なく(nimcapのコメントを念頭に置いて;))、簡単にこれを行うことができます。

Gson gson = new Gson(); 
final User user = gson.fromJson(jsonString, User.class);

jsonStringは上記のJSON文字列です。

詳細については、https://code.google.com/p/google-gson/をご覧ください。


3
そして、はい、私は質問が4年前に尋ねられたことに気付きますが、私の答えは、現時点でこれを行う必要がある利害関係者向けです:)それが誰かを助けることを願っています!
sufinawaz 2013年

22

Java用の多くのJSONパーサーがあります

  • JSONObject.java
    JSONObjectは、名前と値のペアの順不同のコレクションです。その外部形式は、名前と値の間にコロンがあり、値と名前の間にコンマがある中括弧で囲まれた文字列です。内部フォームは、名前で値にアクセスするためのget()およびopt()メソッドと、名前で値を追加または置換するためのput()メソッドを持つオブジェクトです。値は、ブール、JSONArray、JSONObject、Number、Stringのいずれかのタイプ、またはJSONObject.NULLオブジェクトです。

  • JSONArray.java
    JSONArrayは、値の順序付けされたシーケンスです。その外部形式は、値の間にコンマを入れて角括弧で囲んだ文字列です。内部形式は、インデックスで値にアクセスするためのget()およびopt()メソッドと、値を追加または置換するためのput()メソッドを持つオブジェクトです。値は、ブール、JSONArray、JSONObject、Number、Stringのいずれかのタイプ、またはJSONObject.NULLオブジェクトです。

  • JSONStringer.java
    JSONStringerは、JSONテキストを迅速に生成するためのツールです。

  • JSONWriter.java
    JSONWriterは、JSONテキストをストリームにすばやく書き込むためのツールです。

  • JSONTokener.java
    JSONTokenerはソース文字列を受け取り、そこから文字とトークンを抽出します。JSONObjectおよびJSONArrayコンストラクターがJSONソース文字列を解析するために使用します。

  • JSONException.java
    JSONExceptionは、構文エラーまたは手続きエラーが検出されたときにスローされます。

  • JSONString.java
    JSONStringは、クラスがJSONシリアル化を実装できるようにするインターフェースです。


1
J2MEにjava.io.IOExceptionがある場合。java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.Method; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet;の場合、単純なjavaクラスであるため、最初のものを使用できます。
EstebanKüber2009

2
MIDP 2.0にはjava.lang.reflectパッケージはないと思います。汎用的なパーサーを作成するのが難しくなります...
PhiLho

2
スマートな人、ボイジャー、あなたは標準のJava JSONクラスのドキュメントにコピーしました。
TheFlash 2009

@ジェレミー・ラッド:もちろん私がやった、どうやって私がそんなに速くやったと思いましたか?それはあなたを荒らそうとする試みではなく、リンクとコピーの両方を行うための標準的な習慣でした。そのように出てごめんなさい。
EstebanKüber2009

10
それは質問に答えないので、私はこれに反対しました。関連するクラスのリストを提供しますが、実際に要求者が望んでいることを達成するクラスはありません。
ジェフマーティン

7

JSON公式サイトをご覧ください。これは、Javaで使用できるさまざまなライブラリを提供します。私はこれを個人的に使用しました。JSON-libはサイトでの作業の実装であり、このページのメソッドなどとまったく同じです

そこにあるHTMLリンクをクリックすると、必要なものがすべて見つかります。

要するに:

jsonオブジェクトとjson配列を作成するためのコードは次のとおりです。

JSONObject obj = new JSONObject();
obj.put("variable1", o1);
obj.put("variable2", o2);
JSONArray array = new JSONArray();
array.put(obj);

o1、o2は、プリミティブ型(long、int、boolean)、文字列、または配列にすることができます。

逆のプロセスはかなり単純です。つまり、文字列をjsonオブジェクト/配列に変換します。

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

正しく解析されるためには、配列とオブジェクトのどちらを解析するかを知る必要があります。



5

多くの人がすでに述べたように、以下のようにJSON.simpleを使用してこれを行うかなり単純な方法

import org.json.JSONObject;

String someJsonString = "{name:"MyNode", width:200, height:100}";
JSONObject jsonObj = new JSONObject(someJsonString);

そして、jsonObjを使用してJSONオブジェクトを処理します。例:jsonObj.get( "name");

以下のリンクのとおり、JSON.simpleは小さなJSONファイルと大きなJSONファイルの両方で一定の効率を示しています

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


あなたが投稿した提案はすでに多くの人が述べていると書いています。あなたの答えの本質は何ですか?
dakab 2015年

1
@dakabコメントありがとうございます。この質問の本質は、目的を果たす1行のコードを提供することでした。そして、これを行うために利用可能な多くのAPIがあるので、APIの効率の比較についてもいくつか追加の情報を提供したかっただけです。したがって、私が意味したこの回答の本質は、コードと、このスレッドの他のフェローによって言及されたさまざまなAPIの効率の比較に関する情報を提供することでした。
Kripz、2015年


3

これは古い質問であり、json-simple(https://code.google.com/p/json-simple/)はその時点で良い解決策になる可能性がありますが、プロジェクトがしばらくアクティブではないように見えることを考慮してください!

現在ホストされているGsonをお勧めしますhttps : //github.com/google/gson

パフォーマンスが問題であるならば、あなたはいくつかのベンチマークを見て持つことができhttp://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/比較します。



2

json.orgを使用してJSONを解析するライブラリを作成しましたが、実際にはインターフェースのプロキシが作成されます。コード/ JARはcode.google.comにあります。

http://fixjures.googlecode.com/

J2MEで動作するかどうかはわかりません。Javaリフレクションを使用してプロキシを作成しているため、機能しないと考えています。また、現在は削除したいGoogleコレクションへの強い依存関係があり、おそらくあなたのニーズには重すぎるかもしれませんが、あなたが探している方法でJSONデータとやり取りすることができます:

interface Foo {
    String getName();
    int getWidth();
    int getHeight();
}

Foo myFoo = Fixjure.of(Foo.class).from(JSONSource.newJsonString("{ name : \"foo name\" }")).create();
String name = myFoo.getName(); // name now .equals("foo name");

素晴らしいですが、Fooは必要ありませんが、ネイティブオブジェクトのみです。
TheFlash 2009

2

次のJson文字列を使用して、JavaでJsonオブジェクトを作成するだけです。

{name:"MyNode", width:200, height:100}

上記がJson文字列の場合は、それを使用してJsonオブジェクトを作成します。

JsonString ="{name:"MyNode", width:200, height:100}";
JSONObject yourJsonObject = new JSONObject(JsonString);
System.out.println("name=" + yourJsonObject.getString("name"));
System.out.println("width=" + yourJsonObject.getString("width"));

2

ジャクソン大きなファイルのため、GSON小さなファイルのため、およびJSON.simpleの両方を扱います。


1
証拠はここからthangaさんのコメント@バックアップするblog.takipi.com/...
Gob00st

これも以前に見たことがありますが、小さいファイルはとにかく高速に解析できることも考慮してください。私がJSON.simpleについて考えるのは、ジャクソンとの30%程度の差が追加されるところを解析する小さなファイルのトンがある場合だけです。そこのトップコメントも参照してください。そのベンチマークは信頼性が高すぎるとは限りません。実際、速度がそれほど重要な場合は、パーサーを挿入して実装を簡単に変更できるように設計し、独自のベンチマークテストを実行する必要があります。
ユーザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.