JavaでハッシュマップをJSONオブジェクトに変換する方法


286

JavaでハッシュマップをJSONオブジェクトに変換またはキャストし、JSONオブジェクトをJSON文字列に再度変換する方法は?

回答:


435

以下を使用できます。

new JSONObject(map);

注意:これは、Map<String, String>!

ドキュメントから取得できるその他の関数
http://stleary.github.io/JSON-java/index.html


85
これは文字列、文字列マップでのみ機能し、複雑な文字列、オブジェクトでは機能しません。
スロット

2
あなたは入れMapJSONObjectいますが、jsonObjectからこのマップをどのように取得できますか?
ユバラジ2014

1
@Yubiこれはあなたを助けるかもしれません:stackoverflow.com/questions/21720759/convert-jsonobject-to-map
Hannoun Yassir

8
@slottは古いバージョンに適しています。kitkatなどの新しいバージョンは、HashMap <String、Object>()をオブジェクトとして含むHashMap <String、Object>()などのより複雑なオブジェクトで正常に動作しています。だから私はGsonをお勧めします。
Luismi 14

私はただそれを探していました
Naveed Ahmad

169

Gsonは、任意の複雑なオブジェクトをシリアル化するためにも使用できます。

使い方は次のとおりです。

Gson gson = new Gson(); 
String json = gson.toJson(myObject); 

Gsonコレクションを自動的にJSON配列に変換します。Gsonはプライベートフィールドをシリアル化でき、一時的なフィールドを自動的に無視します。


1
注:これは、null値のキーを保持しません。
Vikas

58

jsonの使用例

Map<String, Object> data = new HashMap<String, Object>();
    data.put( "name", "Mars" );
    data.put( "age", 32 );
    data.put( "city", "NY" );
    JSONObject json = new JSONObject();
    json.putAll( data );
    System.out.printf( "JSON: %s", json.toString(2) );

出力::

JSON: {
  "age": 32,
  "name": "Mars",
  "city": "NY"
}

GoogleのGSONを使用することもできます。GoogleのGSONは、JavaオブジェクトをJSON表現に変換するために利用できる最高のライブラリです。

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


2
発掘して申し訳ありませんが、2で何をするの2ですか?json.toString(
Jack

public String toString(int radix).toString(2)は、文字列表現に使用されます。詳細については、stackoverflow.com
questions / 3615721 /…

11
これはどのJSONObjectクラスですか?
Janus Troelsen 2016年

18
そのようなメソッドはありません:(new org.json.JSONObject())。putAll();
Zon

50

次のようMapJSON使用に変換できJacksonます。

Map<String,Object> map = new HashMap<>();
//You can convert any Object.
String[] value1 = new String[] { "value11", "value12", "value13" };
String[] value2 = new String[] { "value21", "value22", "value23" };
map.put("key1", value1);
map.put("key2", value2);
map.put("key3","string1");
map.put("key4","string2");

String json = new ObjectMapper().writeValueAsString(map);
System.out.println(json);

Mavenの依存関係Jackson

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.5.3</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
    <scope>compile</scope>
</dependency>

JSONObjectライブラリを使用している場合は、マップをJSON次のように変換できます。

Map<String, Object> map = new HashMap<>();
// Convert a map having list of values.
String[] value1 = new String[] { "value11", "value12", "value13" };
String[] value2 = new String[] { "value21", "value22", "value23" };
map.put("key1", value1);
map.put("key2", value2);

JSONObject json = new JSONObject(map);
System.out.println(json);

Mavenの依存関係JSONObject

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>

これがお役に立てば幸いです。ハッピーコーディング。


1
Mapを引数として渡すことができることを知りませんでした。おかげで、とても役に立ちました。
グルカ2017年

@Gurkha感謝してくれてありがとう。
Ankur Mahajan 2017

1
@AnkurMahajan +1:依存関係のある適切な答えを与えるため:)
Badman

1
文字列json = new ObjectMapper()。writeValueAsString(map); Greate
Rohit Luthra

7

私の場合、依存関係はほしくありませんでした。Java 8を使用すると、JSONをこの単純な文字列として取得できます。

Map<String, Object> map = new HashMap<>();
map.put("key", "value");
map.put("key2", "value2");
String json = "{"+map.entrySet().stream()
    .map(e -> "\""+ e.getKey() + "\"" + ":\"" + String.valueOf(e.getValue()) + "\"")
    .collect(Collectors.joining(", "))+"}";

2
あなたはエスケープしていません...キーまたは値にが含まれている"場合、これは壊れます
Janus Troelsen

そうです、このソリューションには一定の制限があり、ネストされたマップもサポートされていません
Andrey Sarul

7

マップを列挙して、JSONObjectにキーと値のペアを追加するだけです。

方法 :

private JSONObject getJsonFromMap(Map<String, Object> map) throws JSONException {
    JSONObject jsonData = new JSONObject();
    for (String key : map.keySet()) {
        Object value = map.get(key);
        if (value instanceof Map<?, ?>) {
            value = getJsonFromMap((Map<String, Object>) value);
        }
        jsonData.put(key, value);
    }
    return jsonData;
}

1
ショートカットと追加のライブラリずに効果的に働いていない
Mavenのツ

Map.Entry <K、V >> entrySet()は、マップの反復用です。キーを読み取り、各キーのマップを検索することは、次善の方法です。
マーティン

7

Underscore-javaライブラリは、ハッシュマップまたは配列リストをjsonおよびその逆に変換できます。

import com.github.underscore.lodash.U;
import java.util.*;

public class Main {

    public static void main(String[] args) {

        Map<String, Object> map = new LinkedHashMap<>();
        map.put("1", "a");
        map.put("2", "b");

        System.out.println(U.toJson(map));
        // {
        //    "1": "a",
        //    "2": "b"
        // }
    }
}

5

パーティーには遅れますが、ここに私のGSONがありますハッシュマップをシリアル化するためのアドホックライターがあります。キーと値のペアのマップをjson文字列属性として記述する必要がありましたが、特定のものは整数型であると想定しています。この単純なユースケースでは、カスタムJavaBeanラッパーを作成したくありませんでした。

GSON JsonWriterクラスは、厳密に型指定されたwriter.value()関数をいくつか含むシリアライザクラスを簡単に使用できます。

// write Map as JSON document to http servlet response
Map<String,String> sd = DAO.getSD(123);
res.setContentType("application/json; charset=UTF-8");
res.setCharacterEncoding("UTF-8");
JsonWriter writer = new JsonWriter(new OutputStreamWriter(res.getOutputStream(), "UTF-8"));
writer.beginObject();
for(String key : sd.keySet()) {
    String val = sd.get(key);
    writer.name(key);
    if (key.equals("UniqueID") && val!=null)
        writer.value(Long.parseLong(val));
    else
        writer.value(val);
}
writer.endObject();
writer.close();

カスタムタイプが必要ない場合は、toJson()関数を使用するだけで済みます。gson-2.2.4.jarライブラリは、残忍な依存関係なしで190KB未満です。大きなフレームワーク統合なしで、カスタムサーブレットアプリやスタンドアロンアプリケーションで簡単に使用できます。

Gson gson = new Gson(); 
String json = gson.toJson(myMap); 

4

これは通常、Jsonライブラリの作業です。自分で作成しようとしないでください。すべてのjsonライブラリは、求めているものを実装する必要があります。また、ページの下部にあるjson.orgの Java Jsonライブラリのリストを見つけることができます。


4

それを処理する別の方法を見つけました。

Map obj=new HashMap();    
obj.put("name","sonoo");    
obj.put("age",new Integer(27));    
obj.put("salary",new Double(600000));   
String jsonText = JSONValue.toJSONString(obj);  
System.out.print(jsonText);

お役に立てれば。

ありがとう。


3

コードで使用する必要がある場合。

Gson gsone = new Gson();
JsonObject res = gsone.toJsonTree(sqlParams).getAsJsonObject();

3

を使用org.json.simple.JSONObjectしている場合は、マップをJson文字列に変換し、解析してを取得できますJSONObject

JSONObject object = (JSONObject) new JSONParser().parse(JSONObject.toJSONString(map));

3

決して遅刻しない方がいい。シリアル化されたリストが必要な場合は、GSONを使用してHashMapのリストを文字列に変換しました。

List<HashMap<String, String>> list = new ArrayList<>();
HashMap<String,String> hashMap = new HashMap<>();
hashMap.add("key", "value");
hashMap.add("key", "value");
hashMap.add("key", "value");
list.add(hashMap);

String json = new Gson().toJson(list);

これjsonにより[{"key":"value","key":"value","key":"value"}]


これは質問の答えにはなりません。JSONオブジェクトではなく、JSON配列を生成しています。そして、他の誰かがすでにを使用してハッシュマップからJSONオブジェクトを作成する方法を示していますGson
Stephen C

こんにちは、@ StephenCです。一部のユーザーは、JSONオブジェクトではなくJSON配列の例を探している可能性があります。GSONを使用したシリアル化に関連する他の回答を提供できることを願っています。申し訳ありませんが、この回答は別のスレッドに投稿する必要があります。
Kelly Budol

私たちはきちんと検索する人々のために答えを書くべきです。トピック外の回答を投稿して検索できない人に対応しようとすると、サイトが「ノイズ」で低下し、関連する回答を検索する方法を知っている人が見つけにくくなります。この回答が間違った場所にあることに(今)同意した場合は、削除してください。
Stephen C

1
@KellyBudol良いか悪いか、あなたの答えは私が探しているものです。ありがとうMan
vd

2

ここにGSONを使用した私の単一行ソリューション:

myObject = new Gson().fromJson(new Gson().toJson(myHashMap), MyClass.class);

2

このソリューションは、複雑なJSONで機能します。

public Object toJSON(Object object) throws JSONException {
    if (object instanceof HashMap) {
        JSONObject json = new JSONObject();
        HashMap map = (HashMap) object;
        for (Object key : map.keySet()) {
            json.put(key.toString(), toJSON(map.get(key)));
        }
        return json;
    } else if (object instanceof Iterable) {
        JSONArray json = new JSONArray();
        for (Object value : ((Iterable) object)) {
            json.put(toJSON(value));
        }
        return json;
    }
    else {
        return object;
    }
}


1

XStreamを使用できます-本当に便利です。こちらの例をご覧ください

package com.thoughtworks.xstream.json.test;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;

public class WriteTest {

    public static void main(String[] args) {

      HashMap<String,String> map = new HashMap<String,String>();
      map.add("1", "a");
      map.add("2", "b");
      XStream xstream = new XStream(new JettisonMappedXmlDriver());

      System.out.println(xstream.toXML(map));       

    }

}

ただし、xstreamオブジェクトはだれでもキャッシュする必要があります
Joost

1

使用している場合net.sf.json.JSONObject、そのJSONObject(map)中にコンストラクターは見つかりません。public static JSONObject fromObject( Object object )メソッドを使用する必要があります。このメソッドは、JSON形式の文字列、Maps、DynaBeans、JavaBeansを受け入れます。

JSONObject jsonObject = JSONObject.fromObject(myMap);


1

複雑なオブジェクトを使用する場合は、https: //stackoverflow.com/a/24635655/2914140およびhttps://stackoverflow.com/a/26374888/2914140に記載されているように、enableComplexMapKeySerialization()を適用する必要があります

Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Map<Point, String> original = new LinkedHashMap<Point, String>();
original.put(new Point(5, 6), "a");
original.put(new Point(8, 8), "b");
System.out.println(gson.toJson(original));

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

{
 "(5,6)": "a",
 "(8,8)": "b"
}

1

GsonやJSON解析ライブラリは必要ありません。 だけを使用してnew JSONObject(Map<String, JSONObject>).toString()、例えば:

/**
 * convert target map to JSON string
 *
 * @param map the target map
 * @return JSON string of the map
 */
@NonNull public String toJson(@NonNull Map<String, Target> map) {
    final Map<String, JSONObject> flatMap = new HashMap<>();
    for (String key : map.keySet()) {
        try {
            flatMap.put(key, toJsonObject(map.get(key)));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    try {
        // 2 indentSpaces for pretty printing
        return new JSONObject(flatMap).toString(2);
    } catch (JSONException e) {
        e.printStackTrace();
        return "{}";
    }
}

例外を飲み込んで空のオブジェクトを返すのは悪い考えです。
Stephen C

1
    import org.json.JSONObject;

    HashMap<Object, Object> map = new HashMap<>();
    String[] list={"Grader","Participant"};
    String[] list1={"Assistant","intern"};
    map.put("TeachingAssistant",list);
    map.put("Writer",list1);
    JSONObject jsonObject = new JSONObject(map);
    System.out.printf(jsonObject.toString());

    // Result: {"TeachingAssistant":["Grader","Participant"],"Writer":["Assistant","intern"]}

これは単に以前の答えを繰り返すだけです。
Stephen C

1

HashMapが本当に必要ない場合は、次のようにすることができます。

String jsonString = new JSONObject() {{
  put("firstName", user.firstName);
  put("lastName", user.lastName);
}}.toString();

出力:

{
  "firstName": "John",
  "lastName": "Doe"
}

はい、そうです。ただし、この質問では、から始まるHashMap JSONオブジェクトを作成する方法を求めていますが、これでは答えられません。
Stephen C

一部の人々は、一般的な解決策を探してグーグルからここに着陸することができました。上記の答えは彼らを助けるかもしれません。
Rafal Enden

1

私はAlibaba fastjsonを使用しています。簡単でシンプルです。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>VERSION_CODE</version>
</dependency>

そしてインポート:

import com.alibaba.fastjson.JSON;

次に:

String text = JSON.toJSONString(obj); // serialize
VO vo = JSON.parseObject("{...}", VO.class); //unserialize

全て大丈夫。


1

JSR 374を使用している場合:JSON処理用のJava API(javax json)これで問題が解決するようです。

    JsonObjectBuilder job = Json.createObjectBuilder((Map<String, Object>) obj);
    JsonObject jsonObject = job.build();

0

あなたはGsonを使うことができます。このライブラリは、JavaオブジェクトをJSONオブジェクトに、またはその逆に変換する簡単なメソッドを提供します。

例:

GsonBuilder gb = new GsonBuilder();
Gson gson = gb.serializeNulls().create();
gson.toJson(object);

デフォルト以外の構成オプションを設定する必要がある場合は、GsonBuilderを使用できます。上記の例では、変換プロセスはオブジェクトからnull属性をシリアル化します。

ただし、このアプローチは非ジェネリック型に対してのみ機能します。ジェネリック型の場合は、toJson(object、Type)を使用する必要があります。

Gsonの詳細はこちら

オブジェクトはSerializableインターフェースを実装する必要があることに注意してください。


0

これは私のために働きます:

import groovy.json.JsonBuilder
properties = new Properties()
properties.put("name", "zhangsan")

println new JsonBuilder(properties).toPrettyString()

1
これはGroovyの質問ではありません。
Stephen C

@ stephen-c javaは単なる言語ではなくプラットフォームであり、groovyは単なるjarファイルです。
jiahut

あなたの質問のコードはJavaではありません。そのコードが実際に機能する場合は、Javaを使用していません。Javaには「println」ステートメントがなく、そのような変数を宣言することはできません。私はあなたがGroovyを使用していると思いますが、私にはわかりません。いずれにせよ、JavaコードではJavaライブラリーの代わりにGroovyライブラリーを使用するように人々に勧める...良い考えではありません。
Stephen C

0

TypeToken.getParameterized メソッドを使用したもう少し複雑なマップとリストのGson方法:

次のようなマップがあります。

Map<Long, List<NewFile>> map;

上記のgetParameterizedメソッドを使用して、次のようにTypeを取得します

Type listOfNewFiles = TypeToken.getParameterized(ArrayList.class, NewFile.class).getType();
Type mapOfList = TypeToken.getParameterized(LinkedHashMap.class, Long.class, listOfNewFiles).getType();

そして、Gsonオブジェクトの使用fromJsonを使用して、このようなメソッドをmapOfListのこのようなオブジェクトを:

Map<Long, List<NewFile>> map = new Gson().fromJson(fileContent, mapOfList);

上記のオブジェクトNewFileは次のようになります。

class NewFile
{
    private long id;
    private String fileName;

    public void setId(final long id)
    {
        this.id = id;
    }

    public void setFileName(final String fileName)
    {
        this.fileName = fileName;
    }
}

逆シリアル化されたJSONは次のようになります。

{
  "1": [
    {
      "id": 12232,
      "fileName": "test.html"
    },
    {
      "id": 12233,
      "fileName": "file.txt"
    },
    {
      "id": 12234,
      "fileName": "obj.json"
    }
  ],
 "2": [
    {
      "id": 122321,
      "fileName": "test2.html"
    },
    {
      "id": 122332,
      "fileName": "file2.txt"
    },
    {
      "id": 122343,
      "fileName": "obj2.json"
    }
  ]
}


-1

セレンのカスタムコマンドからの応答を逆シリアル化するときに、同様の問題に直面しました。応答はjsonでしたが、セレンは内部でそれをjava.util.HashMap [String、Object]に変換します

Scalaに精通していて、JSONにplay-APIを使用している場合は、次のようなメリットがあります。

import play.api.libs.json.{JsValue, Json}
import scala.collection.JavaConversions.mapAsScalaMap


object JsonParser {

  def parse(map: Map[String, Any]): JsValue = {
    val values = for((key, value) <- map) yield {
      value match {
        case m: java.util.Map[String, _] @unchecked => Json.obj(key -> parse(m.toMap))
        case m: Map[String, _] @unchecked => Json.obj(key -> parse(m))
        case int: Int => Json.obj(key -> int)
        case str: String => Json.obj(key -> str)
        case bool: Boolean => Json.obj(key -> bool)
      }
    }

    values.foldLeft(Json.obj())((temp, obj) => {
      temp.deepMerge(obj)
    })
  }
}

小さなコードの説明:

コードは、基本型(String、Integer、Boolean)が見つかるまでHashMapを再帰的に走査します。これらの基本タイプは、JsObjectに直接ラップできます。再帰が展開されると、deepmergeは作成されたオブジェクトを連結します。

'@unchecked'はタイプ消去警告を処理します。


これはScalaの質問ではありません
Stephen C

-1

まず、すべてのオブジェクトを有効な文字列に変換します

HashMap<String, String> params = new HashMap<>();
params.put("arg1", "<b>some text</b>");
params.put("arg2", someObject.toString());

次に、マップ全体をorg.json.JSONObjectに挿入します

JSONObject postData = new JSONObject(params);

これで、オブジェクトのtoStringを呼び出すだけでJSONを取得できます

postData.toString()
//{"arg1":"<b>some text<\/b>" "arg2":"object output"}

新しいJSONObjectを作成する

JSONObject o = new JSONObject(postData.toString());

またはHTTP経由で送信するためのバイト配列として

postData.toString().getBytes("UTF-8");

これは、何年も前からの以前の回答と同じことを言っていますが、簡潔であることの利点はありません。
Stephen C

@StephenC私はあなたが何をしているのかわからない
G_V

@StephenC "JavaでハッシュマップをJSONオブジェクトに変換またはキャストし、JSONオブジェクトをJSON文字列に再度変換する方法?"
G_V

362人(および数えています)は、stackoverflow.com / a / 12155874/139985が質問に答えると思います。それは基本的にあなたの答えがフリルビットなしで言うことを言います。
スティーブンC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.