如何在Java中将哈希图转换为JSON对象


286

如何在Java中将hashmap转换或转换为JSON对象,然后再次将JSON对象转换为JSON字符串?

Answers:


435

您可以使用:

new JSONObject(map);

注意:这仅适用于Map<String, String>!

您可以从其文档中获得其他功能
http://stleary.github.io/JSON-java/index.html


85
这仅适用于String,String映射,不适用于复杂的String,Object。
老虎机

2
你是把MapJSONObject,但你怎么能得到的JSONObject此地图?
Yubaraj


8
@slott适用于旧版本。像kitkat这样的较新版本可以与包含HashMap <String,Object>()作为对象的更复杂的对象(如HashMap <String,Object>())配合使用。所以我推荐格森。
Luismi 2014年

我只是在寻找它
Naveed Ahmad

169

Gson还可以用于序列化任意复杂的对象。

使用方法如下:

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

Gson将自动将集合转换为JSON数组。Gson可以序列化私有字段,并自动忽略瞬态字段。


1
注意:这不会保留具有空值的键。
维卡斯

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
对不起,很抱歉,但是2json.toString(2`中做什么?
杰克

public String toString(int radix).toString(2)用于字符串表示。更多stackoverflow.com/questions/3615721/...
Mohammod侯赛因

11
这是哪个JSONObject类?
Janus Troelsen

18
没有这样的方法:(new org.json.JSONObject())。putAll();
Zon 2015年

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库,则可以将map转换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作为参数,谢谢,帮助很大。
Gurkha

@Gurkha感谢您的赞赏。
Ankur Mahajan

1
@AnkurMahajan +1给出了依赖项的正确答案:)
Badman

1
字符串json = new ObjectMapper()。writeValueAsString(map); 马丽娟
罗希特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 '16

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
没有捷径,没有任何额外的库有效地工作
行家ツ

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即席作家,用于序列化hashmap。我不得不将键值对的映射写为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,没有任何残酷的依赖关系。易于在任何自定义servlet应用程序或独立应用程序上使用,而无需进行大型框架集成。

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 String并对其进行解析以获得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
斯蒂芬·C

@StephenC,您好,有些人可能在寻找JSON数组而不是JSON Object的示例,因为到目前为止,最高注释已经提供了最佳答案。希望我们可以提供其他有关使用GSON进行序列化的答案。抱歉,此答案应发布在其他主题上。
凯利·布多

我们应该为正确搜索的人写答案。如果我们试图通过发布离题的答案来迎合那些无法搜索的人,则它会以“噪音”降级网站,并使知道如何搜索的人更难找到相关的答案。如果您(现在)同意此答案在错误的位置,请删除它。
斯蒂芬·C

1
@KellyBudol好还是坏,你的答案是什么,我找人for.thanks
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;
    }
}

2

我们使用Gson。

Gson gson = new Gson();
Type gsonType = new TypeToken<HashMap>(){}.getType();
String gsonString = gson.toJson(elements,gsonType);

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的对象的人
朱斯特

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/2914140https://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

有些人可能会从Google登陆这里寻找通用解决方案。上面的答案可能会帮助他们。
拉法尔·恩登

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。在上面的示例中,转换过程还将序列化来自对象的空属性。

但是,此方法仅适用于非泛型类型。对于泛型类型,您需要使用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代码中使用Groovy库而不是Java库……不是一个好主意。
斯蒂芬·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();

然后使用像这样的mapOfList对象,使用像这样的Gson对象fromJson方法:

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,但是selenium在内部将其转换为java.util.HashMap [String,Object]

如果您熟悉scala并将play-API用于JSON,则可以从中受益:

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)
    })
  }
}

小代码说明:

该代码以递归方式遍历HashMap,直到找到基本类型(字符串,整数,布尔值)为止。这些基本类型可以直接包装到JsObject中。展开递归后,深度合并将创建的对象连接起来。

“ @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回答了问题。它基本上说出您的回答是什么,而无需打扰。
Stephen C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.