强悍的毛衣 · 从零开始学机器学习——逻辑回归 - ...· 2 周前 · |
火星上的蚂蚁 · 柯南剧场版《黑铁的鱼影》首周末票房超31亿, ...· 1 年前 · |
讲道义的小熊猫 · 史上第一祖师爷73_史上第一祖师爷73章_史 ...· 1 年前 · |
近视的眼镜 · 第137话 - 陷阱 - 包子漫画· 1 年前 · |
闷骚的灌汤包 · S3DIS场景点云数据集_腾阳山泥若的博客- ...· 1 年前 · |
如何在Java中将hashmap转换或转换为JSON对象,并再次将JSON对象转换为JSON字符串?
这通常是Json库的工作,你不应该自己去做。所有json库都应该实现您所要求的内容,您可以在页面底部的 json.org 上找到Java Json库的列表。
使用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表示的最佳库。
你可以使用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));
}
Gson 还可以用于序列化任意复杂的对象。
下面是你如何使用它:
Gson gson = new Gson();
String json = gson.toJson(myObject);
Gson
会自动将集合转换为
JSON
数组。Gson可以序列化私有字段,并自动忽略瞬态字段。
来晚了,但这里是我的 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));
writer.value(val);
writer.endObject();
writer.close();
如果不需要任何自定义类型,我可以只使用toJson()函数。gson-2.2.4.jar库不到190KB,没有任何严重的依赖关系。易于在任何自定义servlet应用程序或独立应用程序上使用,无需大型框架集成。
Gson gson = new Gson();
String json = gson.toJson(myMap);
如果您使用的是
net.sf.json.JSONObject
,那么您不会在其中找到
JSONObject(map)
构造函数。您必须使用
public static JSONObject fromObject( Object object )
方法。这个方法接受JSON格式的字符串、Maps、DynaBeans和JavaBeans。
JSONObject jsonObject = JSONObject.fromObject(myMap);
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"
}
如果您需要在代码中使用它。
Gson gsone = new Gson();
JsonObject res = gsone.toJsonTree(sqlParams).getAsJsonObject();
在我的例子中,我不想要任何依赖。使用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(", "))+"}";
在selenium中反序列化来自自定义命令的响应时,我遇到了类似的问题。响应是json,但selenium会在内部将其转换为java.util.HashMapString对象
如果您熟悉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)
}
小代码描述:
代码递归地遍历HashMap,直到找到基本类型(字符串、整数、布尔值)。这些基本类型可以直接包装到JsObject中。当递归展开时,深度合并将连接所创建的对象。
'@unchecked‘处理类型擦除警告。
您可以只枚举映射并将键-值对添加到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;
}
下面是我使用GSON的单行解决方案:
myObject = new Gson().fromJson(new Gson().toJson(myHashMap), MyClass.class);
对于那些使用
org.json.simple.JSONObject
的用户,您可以将映射转换为Json字符串,并对其进行解析以获得
JSONObject
。
JSONObject object = (JSONObject) new JSONParser().parse(JSONObject.toJSONString(map));
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"]}
我找到了另一种方法来处理它。
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);
希望这能有所帮助。
谢谢。
如果你并不真正需要HashMap,那么你可以这样做:
String jsonString = new JSONObject() {{
put("firstName", user.firstName);
put("lastName", user.lastName);
}}.toString();
输出:
{
"firstName": "John",
"lastName": "Doe"
}
这对我来说很有效:
import groovy.json.JsonBuilder
properties = new Properties()
properties.put("name", "zhangsan")
println new JsonBuilder(properties).toPrettyString()
我使用的是阿里巴巴的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
一切都很好。
此解决方案适用于复杂的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;
}
近视的眼镜 · 第137话 - 陷阱 - 包子漫画 1 年前 |