如何在Java中将hashmap转换或转换为JSON对象,并再次将JSON对象转换为JSON字符串?
答案 0 :(得分:361)
您可以使用:
new JSONObject(map);
警告:这仅适用于Map<String, String>!
您可以从其文档中获得的其他功能
http://stleary.github.io/JSON-java/index.html
答案 1 :(得分:139)
Gson也可用于序列化任意复杂的对象。
以下是您使用它的方式:
Gson gson = new Gson();
String json = gson.toJson(myObject);
Gson
会自动将集合转换为JSON
数组。 Gson可以序列化私有字段并自动忽略瞬态字段。
答案 2 :(得分:51)
使用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表示的最佳库。
答案 3 :(得分:33)
您可以使用Map
将JSON
转换为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);
Jackson
的Maven依赖关系:
<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);
JSONObject
的Maven依赖关系:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
希望这会有所帮助。快乐的编码。
答案 4 :(得分:6)
您可以枚举地图并将键值对添加到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;
}
答案 5 :(得分:5)
晚会但是这里是我的GSON adhoc编写器,用于序列化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);
答案 6 :(得分:4)
这通常是Json库的工作,你不应该自己尝试。所有json库都应该实现你所要求的,你可以 在页面底部的json.org上找到Java Json库列表。
答案 7 :(得分:3)
我们使用Gson。
class SavingsAccount(ext.db.Model):
__tablename__ = "test_account"
id = ext.db.Column(ext.db.Integer, primary_key=True)
user_id = ext.db.Column(ext.db.Integer, ext.db.ForeignKey("test_user.id"), nullable=False)
balance = ext.db.Column(ext.db.Numeric(15, 5))
class User(ext.db.Model):
__tablename__ = "test_user"
id = ext.db.Column(ext.db.Integer, primary_key=True)
name = ext.db.Column(ext.db.String(100), nullable=False)
accounts = ext.db.relationship("SavingsAccount", backref="owner")
@event.listens_for(mapper, "mapper_configured")
def set_thread_count(mapper, cls) -> None:
if not issubclass(cls, User):
return
total_balance_subquery = (
select([func.sum(SavingsAccount.balance)])
.where(SavingsAccount.user_id == cls.id)
.label("total_balance")
)
cls.total_balance = column_property(total_balance_subquery, deferred=True)
答案 8 :(得分:3)
就我而言,我不想要任何依赖。使用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(", "))+"}";
答案 9 :(得分:3)
我找到了另一种方法来处理它。
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);
希望这有帮助。
感谢。
答案 10 :(得分:2)
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 HashMap<String, Object>();
map.put("1", "a");
map.put("2", "b");
System.out.println(U.toJson(map));
// {
// "1": "a",
// "2": "b"
// }
}
}
答案 11 :(得分:2)
对于那些使用org.json.simple.JSONObject
的人,你可以将地图转换为Json String并解析它以获得JSONObject
。
JSONObject object = (JSONObject) new JSONParser().parse(JSONObject.toJSONString(map));
答案 12 :(得分: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 "{}";
}
}
答案 13 :(得分:1)
迟到总比不到好。如果需要序列化列表,我使用 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"}]
答案 14 :(得分:1)
你可以使用XStream - 它非常方便。请参阅示例here
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));
}
}
答案 15 :(得分:1)
这是我使用GSON的单行解决方案:
package filehandling;
import java.util.Scanner;
public class PasswordValidation {
public static void main(String[] args) {
String enterPassword ;
String reEnterPassword ;
boolean passValid ;
boolean isPassMatch ;
Scanner password = new Scanner(System.in);
System.out.println("Enter Your Password:");
System.out.println("(Must be at least 8 characters, contain a number, letter, and special character");
enterPassword = password.nextLine();
passValid = checkPassIsValid(enterPassword);
if(passValid) {
System.out.println("Re-Enter Your Password: ");
reEnterPassword = password.nextLine();
isPassMatch = checkPasswordMatching(enterPassword,reEnterPassword);
if(!isPassMatch)
System.out.println("Password do Not Match: ");
else if (isPassMatch)
System.out.println("Password Set.");
}
else
System.out.println("Password is Not Valid.");
}
private static boolean checkPassIsValid(String enterPassword) {
boolean length = false;
boolean letter = false;
boolean digit = false;
boolean space = false;
boolean startSpace = false;
boolean special = false;
boolean start1 = false;
boolean start2 = false;
boolean valid = false;
for(int i = 0; i < enterPassword.length(); i++) {
char c = enterPassword.charAt(i);
if(enterPassword.length() >= 8)
length = true;
if(Character.isDigit(c))
digit = true;
if(Character.isLetter(c))
letter = true;
if(Character.isSpaceChar(c))
space = true;
if( (!Character.isDigit(c)) && (!Character.isLetter(c)) )
special = true;
if(enterPassword.startsWith(" "))
startSpace = true;
else if(enterPassword.startsWith("?"))
start1 = true;
else if(enterPassword.startsWith("!"))
start2 = true;
if(letter && digit && special && length)
valid = true;
if(start1 || start2 || startSpace)
valid = false;
}
return valid;
}
private static boolean checkPasswordMatching(String enterPassword,String reEnterPassword) {
if(enterPassword.equals(reEnterPassword))
return true;
return false;
}
}
答案 16 :(得分:1)
如果您需要在代码中使用它。
Gson gsone = new Gson();
JsonObject res = gsone.toJsonTree(sqlParams).getAsJsonObject();
答案 17 :(得分:1)
如果您使用的是net.sf.json.JSONObject
,那么您将无法在其中找到JSONObject(map)
构造函数。您必须使用public static JSONObject fromObject( Object object )
方法。此方法接受JSON格式的字符串,Maps,DynaBeans和JavaBeans。
JSONObject jsonObject = JSONObject.fromObject(myMap);
答案 18 :(得分:0)
如果您使用复杂对象,则应按照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"
}
答案 19 :(得分:0)
您可以使用Gson。 该库提供了将Java对象转换为JSON对象的简单方法,反之亦然。
示例:
GsonBuilder gb = new GsonBuilder();
Gson gson = gb.serializeNulls().create();
gson.toJson(object);
当您需要设置默认值以外的配置选项时,可以使用GsonBuilder。在上面的示例中,转换过程还将序列化对象的null属性。
但是,此方法仅适用于非泛型类型。对于泛型类型,您需要使用toJson(object,Type)。
有关Gson here的更多信息。
请记住,该对象必须实现 Serializable 界面。
答案 20 :(得分:0)
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"]}
答案 21 :(得分:0)
在selenium中从自定义命令反序列化响应时遇到了类似的问题。响应是json,但selenium在内部将其转换为java.util.HashMap [String,Object]
如果您熟悉scala并使用play-API for 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,直到找到基本类型(String,Integer,Boolean)。这些基本类型可以直接包装到JsObject中。展开递归时,deepmerge会连接创建的对象。
'@ unchecked'负责处理类型擦除警告。
答案 22 :(得分:0)
如果您真的不需要HashMap,则可以执行以下操作:
String jsonString = new JSONObject() {{
put("firstName", user.firstName);
put("lastName", user.lastName);
}}.toString();
输出:
{
"firstName": "John",
"lastName": "Doe"
}
答案 23 :(得分:0)
这对我有用:
import groovy.json.JsonBuilder
properties = new Properties()
properties.put("name", "zhangsan")
println new JsonBuilder(properties).toPrettyString()
答案 24 :(得分:0)
我正在使用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
一切都很好。
答案 25 :(得分:0)
此解决方案适用于复杂的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;
}
}
答案 26 :(得分:0)
如果您使用的是JSR 374:用于JSON处理的Java API(javax json) 这似乎可以解决问题:
JsonObjectBuilder job = Json.createObjectBuilder((Map<String, Object>) obj);
JsonObject jsonObject = job.build();
答案 27 :(得分:0)
使用 TypeToken.getParameterized 方法的Gson方法获取更复杂的地图和列表:
我们有一张看起来像这样的地图:
Map<Long, List<NewFile>> map;
我们使用上述 getParameterized 方法获取类型,如下所示:
Type listOfNewFiles = TypeToken.getParameterized(ArrayList.class, NewFile.class).getType();
Type mapOfList = TypeToken.getParameterized(LinkedHashMap.class, Long.class, listOfNewFiles).getType();
然后使用像这样的Gem对象 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"
}
]
}
答案 28 :(得分:-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");