JavaでjsonStringをJSONObjectに変換する方法


423

私は文字列変数と呼ばれていjsonStringます:

{"phonetype":"N95","cat":"WP"}

それをJSONオブジェクトに変換したいと思います。Googleでさらに検索しましたが、期待する回答が得られませんでした...


1
いいえ、そうではありません。json文字列からjsonオブジェクトを作成したかったので、dogbaneからの回答は、正しい回答の道を示していました。
Sajid Shaikh氏、

Mappanとdogbaneの両方の答えは正しいですが、それらは異なるモジュールを使用しています。多くのJSONObjectモジュールがあるため、それぞれに正しいモジュールをインポートするように注意する必要があります。
Arashsoft

GSONライブラリで試しました。こちらのリンクをご確認ください。
Thirumalvalavan 2017

回答:


677

org.jsonライブラリの使用:

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}

7
私はそのようなJSONObject js = new JSONObject(jsonstring);を試してみました。エラーが表示されます。jsonstring
Sajid Shaikh氏

29
彼はorg.jsonを使用していないためにエラーが発生しました。そのように機能しないgoogle-gsonを使用しています。
Gubatron 2011年

2
@Gubatronありがとう正解です。ダウンロードしてjarファイルを作成したので、正常に機能します。
Sajid Shaikh氏、2011

3
@dogbane文字列の構造がわからない場合はどうすればよいですか。より明確には、動的に生成されたjsonStringをjsonObjectに変換するにはどうすればよいですか?
Saumyaraj 14年

70
グーグル-gsonを使用すると、あなたはこのようにそれを行うことができます:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy

163

まだ答えを探している人には:

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);

23
また、同じパッケージをインポートするパッケージについて言及してもらえますか?
2015年

10
これは私のために働いています:import org.json.simple.JSONObject
Mafro34 '29

1
json-simpleのバージョン1.1.1に問題があるようです。上記は、「未処理の例外」を与えparser.parse(、try-catchまたはthrowsを要求します。ただし、いずれかを追加すると、Maven依存関係にjson-simpleがあり、プロジェクトのライブラリに明確に表示されている場合でも、Unhandled exception type ParseExceptionParseExceptionに対してエラーまたはNoClassDefFoundエラーが発生しorg.json.simple.parserます。
Juha Untinen、2016

2
org.jsonは、概念実証ライブラリです。パフォーマンスと機能の面で最悪の1つです。選択する前に、json libの機能セットとパフォーマンスを確認する必要があります。私はJMHを使用したこのベンチマークを参照してください:github.com/fabienrenaud/java-json-benchmarkそれは明らかに5〜6倍高速org.jsonよりも何よりも速くジャクソンを示しています。
fabien 2016年

5
JSONParserパーサー=新しいJSONParser(); 値下がりしているようです
ウイサル

46

使用できますgoogle-gson。詳細:

オブジェクトの例

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

(シリアライズ)

BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj); 
==> json is {"value1":1,"value2":"abc"}

循環再帰が発生するため、循環参照でオブジェクトをシリアル化できないことに注意してください。

(デシリアライゼーション)

BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);  
==> obj2 is just like obj

Gsonの別の例:

Gsonの学習と実装は簡単です。次の2つの方法を知っておく必要があります。

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

-> fromJson()– JSONをJavaオブジェクトに変換します

import com.google.gson.Gson;

public class TestObjectToJson {
  private int data1 = 100;
  private String data2 = "hello";

  public static void main(String[] args) {
      TestObjectToJson obj = new TestObjectToJson();
      Gson gson = new Gson();

      //convert java object to JSON format
      String json = gson.toJson(obj);

      System.out.println(json);
  }

}

出力

{"data1":100,"data2":"hello"}

リソース:

Google Gsonプロジェクトのホームページ

Gsonユーザーガイド


「クライアント側で処理するかどうかは、プログラミング言語によって異なります。たとえば、Javaではgoogle-gsonを使用できます」おそらく「クライアント」ではなく「サーバー」を意味していると思います。そして彼は質問に「Java」というタグを付けました。
TJクラウダー

+1。私は今、Gsonを4-5プロジェクトで、まったく異なるコンテキストで、サーバー側とクライアント側(Androidアプリでも)で使用していますが、失敗することはありません。とても素敵でクリーンなlib。
Jonik 2013年

あなたが使用gsonにしたいが、定義された前POJOクラスを持っていない場合は、この答えは役立つかもしれない(つまり、あなたが事前に定義された構造を持たない一般的なJSONを持っている) - stackoverflow.com/questions/4110664/...
レアンドロデビッド・

40

JSONホームページからリンクされたさまざまなJava JSONシリアライザーとデシリアライザーがあります

これを書いている時点で、次の22があります。

...もちろん、リストは変更できます。


24

Java 7ソリューション

import javax.json.*;

...

String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()

;


5
このライブラリは、それらすべての中で最悪のパフォーマンスを備えています。JMHで行ったこのベンチマークを参照してください:github.com/fabienrenaud/java-json-benchmark
fabien

15

に変換するStringJSONObjectは、Stringインスタンスをのコンストラクタに渡すだけですJSONObject

例えば:

JSONObject jsonObj = new JSONObject("your string");

10

私はこれにgoogle-gsonを使用したいのですが、それはまさにJSONObjectを直接操作する必要がないためです。

その場合、JSONオブジェクトのプロパティに対応するクラスができます。

class Phone {
 public String phonetype;
 public String cat;
}


...
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
Gson gson = new Gson();
Phone fooFromJson = gson.fromJson(jsonString, Phone.class);
...

ただし、あなたの質問は、「JSON文字列からの実際のJSONObjectオブジェクトで終了する方法」のようなものだと思います。

私はgoogle-json apiを見ていましたが、org.jsonのapiほど単純なものを見つけることができませんでした。これは、ベアボーンJSONObjectの使用が非常に必要な場合に使用したいものです。

http://www.json.org/javadoc/org/json/JSONObject.html

org.json.JSONObject(別の完全に異なるAPI)を使用する場合次のようなことをしたい場合...

JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
System.out.println(jsonObject.getString("phonetype"));

google-gsonの優れている点は、JSONObjectを処理する必要がないことです。jsonを取得し、デシリアライズしたいクラスを渡すだけで、クラス属性がJSONと一致しますが、繰り返しになりますが、全員に独自の要件があります。 JSON生成側では動的すぎる可能性があるため、逆シリアル化側。その場合は、json.orgを使用してください。


8

org.jsonをインポートする必要があります

JSONObject jsonObj = null;
        try {
            jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
        } catch (JSONException e) {
            e.printStackTrace();
        }

8

JSONの文字列を使用しJacksoncom.fasterxml.jackson.databind

json-stringが次のように表すと想定します。jsonString = {"phonetype": "N95"、 "cat": "WP"}

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * Simple code exmpl
 */
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonString);
String phoneType = node.get("phonetype").asText();
String cat = node.get("cat").asText();

3

http://json-lib.sourceforge.net (net.sf.json.JSONObject)を使用している場合

とても簡単です:

String myJsonString;
JSONObject json = JSONObject.fromObject(myJsonString);

または

JSONObject json = JSONSerializer.toJSON(myJsonString);

次に、json.getString(param)、json.getInt(param)などを使用して値を取得します。


JSONObject json = JSONSerializer.toJSON(myJsonString); タイプミスマッチのエラーを生成します

3

文字列をjsonに変換すると、文字列はjsonのようになります。{"phonetype": "N95"、 "cat": "WP"}

String Data=response.getEntity().getText().toString(); // reading the string value 
JSONObject json = (JSONObject) new JSONParser().parse(Data);
String x=(String) json.get("phonetype");
System.out.println("Check Data"+x);
String y=(String) json.get("cat");
System.out.println("Check Data"+y);

JSONParserとは何ですか?それは連絡先プロバイダーの一部だけですか?
IgorGanapolsky 2013年

1
@IgorGanapolsky JSONParserは、単純なJSONによって提供されるオプションの組み込みです。これを行うには、json-simple-1.1.1.jarを含めます
Aravind Cheekkallur 2013年

3

Generic Json Parsingには、fasterxmlのJsonNodeを使用してください。すべての入力に対してキー値のマップを内部的に作成します。

例:

private void test(@RequestBody JsonNode node)

入力文字列:

{"a":"b","c":"d"}

2

外部ライブラリを使用する必要はありません。

代わりにこのクラスを使用できます:)(リスト、ネストされたリスト、jsonも処理します)

public class Utility {

    public static Map<String, Object> jsonToMap(Object json) throws JSONException {

        if(json instanceof JSONObject)
            return _jsonToMap_((JSONObject)json) ;

        else if (json instanceof String)
        {
            JSONObject jsonObject = new JSONObject((String)json) ;
            return _jsonToMap_(jsonObject) ;
        }
        return null ;
    }


   private static Map<String, Object> _jsonToMap_(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }


    private static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }


    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
}

JSON文字列をハッシュマップに変換するには、次を使用します。

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(

2

Codehaus Jackson-私は2012年以来、RESTful WebサービスとJUnitテストでこの素晴らしいAPIを使用しています。APIを使用すると、次のことができます。

(1)JSON文字列をJava Beanに変換する

public static String beanToJSONString(Object myJavaBean) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.writeValueAsString(myJavaBean);
}

(2)JSON文字列をJSONオブジェクトに変換(JsonNode)

public static JsonNode stringToJSONObject(String jsonString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readTree(jsonString);
}

//Example:
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";   
JsonNode jsonNode = stringToJSONObject(jsonString);
Assert.assertEquals("Phonetype value not legit!", "N95", jsonNode.get("phonetype").getTextValue());
Assert.assertEquals("Cat value is tragic!", "WP", jsonNode.get("cat").getTextValue());

(3)Java BeanをJSON文字列に変換する

    public static Object JSONStringToBean(Class myBeanClass, String JSONString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readValue(JSONString, beanClass);
}

REFS:

  1. コードハウスジャクソン

  2. JsonNode API -JsonNodeオブジェクトの値を使用、ナビゲート、解析、評価する方法

  3. チュートリアル -Jacksonを使用してJSON文字列をJsonNodeに変換する簡単なチュートリアル


1

インターフェースをデシリアライズするGSONは、以下のような例外をもたらすことに注意してください。

"java.lang.RuntimeException: Unable to invoke no-args constructor for interface XXX. Register an InstanceCreator with Gson for this type may fix this problem."

逆シリアル化しながら; GSONは、そのインターフェースに対してどのオブジェクトをインスタンス化する必要があるかを知りません。

これは何とかここで解決されます

ただし、FlexJSONには本質的にこのソリューションがあります。時間をシリアル化しながら、以下のようにjsonの一部としてクラス名を追加しています。

{
    "HTTPStatus": "OK",
    "class": "com.XXX.YYY.HTTPViewResponse",
    "code": null,
    "outputContext": {
        "class": "com.XXX.YYY.ZZZ.OutputSuccessContext",
        "eligible": true
    }
}

したがって、JSONは扱いにくいものになります。しかしInstanceCreator、GSONで必要な書き込みは必要ありません。


1

org.jsonの使用

JSON形式のテキストを含む文字列がある場合は、次の手順でJSONオブジェクトを取得できます。

String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
JSONObject jsonObj = null;
    try {
        jsonObj = new JSONObject(jsonString);
    } catch (JSONException e) {
        e.printStackTrace();
    }

次に、phonetypeにアクセスします

Sysout.out.println(jsonObject.getString("phonetype"));

0

jsonの単一オブジェクトをリストに設定するために、すなわち

"locations":{

}

List<Location>

使用する

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

jackson.mapper-asl-1.9.7.jar


0

org.json.simple.JSONObjectを使用して文字列をJsonオブジェクトに変換する

private static JSONObject createJSONObject(String jsonString){
    JSONObject  jsonObject=new JSONObject();
    JSONParser jsonParser=new  JSONParser();
    if ((jsonString != null) && !(jsonString.isEmpty())) {
        try {
            jsonObject=(JSONObject) jsonParser.parse(jsonString);
        } catch (org.json.simple.parser.ParseException e) {
            e.printStackTrace();
        }
    }
    return jsonObject;
}

-1

を使用してより簡単な方法でより良い行く org.jsonlib。以下のように非常に単純なアプローチを実行してください:

JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");

objが、JSONObjectそれぞれの文字列を変換した形式です。これは、名前と値のペアがある場合に当てはまります。

文字列の場合、のコンストラクタに直接渡すことができますJSONObject。有効な場合はjson String、それ以外の場合は例外をスローします。


文字通りあなたが書いたことを行う:user.put("email", "someemail@mail.com")未処理の例外をトリガーします。
Sebastialonso

1
@Sebastialonsoはい、例外をキャッチする必要があります。このように:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto

@vidyaいいえ、違います。もう一度比較してみてください。
TheLittleNaruto 2017年

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