วิธีการแปลงหรือแปลง hashmap เป็นวัตถุ JSON ใน Java และแปลงวัตถุ JSON เป็นสตริง JSON อีกครั้ง
วิธีการแปลงหรือแปลง hashmap เป็นวัตถุ JSON ใน Java และแปลงวัตถุ JSON เป็นสตริง JSON อีกครั้ง
คำตอบ:
คุณสามารถใช้ได้:
new JSONObject(map);
ข้อควรระวัง:สิ่งนี้จะใช้ได้กับMap<String, String>!
ฟังก์ชั่นอื่น ๆ ที่คุณสามารถรับได้จากเอกสารประกอบของมัน
http://stleary.github.io/JSON-java/index.html
Map
ลงไปJSONObject
แต่วิธีการที่คุณจะได้รับแผนที่นี้จาก JSONObject?
Gsonยังสามารถใช้ในการทำให้เป็นวัตถุที่ซับซ้อนโดยพลการ
นี่คือวิธีที่คุณใช้:
Gson gson = new Gson();
String json = gson.toJson(myObject);
Gson
จะแปลงคอลเล็กชันเป็นJSON
อาร์เรย์โดยอัตโนมัติ Gson สามารถทำให้เป็นอันดับเขตข้อมูลส่วนตัวและละเว้นเขตข้อมูลชั่วคราวโดยอัตโนมัติ
ตัวอย่างการใช้ 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"
}
นอกจากนี้คุณยังสามารถลองใช้ GSON ของ Google ได้ GSON ของ Google เป็นห้องสมุดที่ดีที่สุดในการแปลง Java Objects ให้เป็นตัวแทน JSON ของพวกเขา
2
ต้องทำในjson.toString(
2`)
คุณสามารถแปลง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);
Maven Dependencies สำหรับ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 Dependencies สำหรับJSONObject
:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
หวังว่าจะช่วยได้ การเข้ารหัสที่มีความสุข
ในกรณีของฉันฉันไม่ต้องการการพึ่งพาใด ๆ การใช้ 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(", "))+"}";
"
ตัวแบ่งนี้
คุณสามารถระบุแผนที่และเพิ่มคู่คีย์ - ค่าลงใน 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;
}
Underscore-java library สามารถแปลง hash map หรือรายการ array เป็น json และ Vice verse
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ของฉัน adhoc writerสำหรับซีเรียลแฮชแม็พ ฉันต้องเขียนแผนที่ของคู่คีย์ - ค่าเป็นคุณลักษณะสตริง json คาดว่าหนึ่งเฉพาะเป็นประเภทจำนวนเต็ม ฉันไม่ต้องการที่จะสร้าง wrapper JavaBean ที่กำหนดเองสำหรับ usecase ง่าย ๆ นี้
คลาส GSON JsonWriter นั้นง่ายต่อการใช้คลาส serializer ที่มีฟังก์ชั่น 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 library อยู่ภายใต้ 190KB โดยไม่มีการอ้างอิงที่โหดร้าย ใช้งานง่ายบนแอปเซิร์ฟเล็ตที่กำหนดเองหรือแอปพลิเคชันแบบสแตนด์อโลนโดยไม่มีการรวมกรอบขนาดใหญ่
Gson gson = new Gson();
String json = gson.toJson(myMap);
นี่เป็นงานของห้องสมุด Json คุณไม่ควรลองด้วยตัวเอง ไลบรารี json ทั้งหมดควรใช้สิ่งที่คุณต้องการและคุณสามารถค้นหารายชื่อของไลบรารี Java Json ได้ที่json.orgที่ด้านล่างของหน้า
ฉันพบวิธีอื่นในการจัดการกับมัน
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);
หวังว่านี่จะช่วยได้
ขอบคุณ
หากคุณต้องการใช้ในรหัส
Gson gsone = new Gson();
JsonObject res = gsone.toJsonTree(sqlParams).getAsJsonObject();
สำหรับผู้ที่ใช้org.json.simple.JSONObject
คุณสามารถแปลงแผนที่เพื่อ Json JSONObject
สตริงและแยกมันจะได้รับ
JSONObject object = (JSONObject) new JSONParser().parse(JSONObject.toJSONString(map));
จะดีกว่าไม่สาย ฉันใช้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"}]
Gson
โดยใช้
นี่คือโซลูชั่นแบบบรรทัดเดียวของฉันกับ GSON:
myObject = new Gson().fromJson(new Gson().toJson(myHashMap), MyClass.class);
วิธีนี้ใช้ได้กับ 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;
}
}
เราใช้ Gson
Gson gson = new Gson();
Type gsonType = new TypeToken<HashMap>(){}.getType();
String gsonString = gson.toJson(elements,gsonType);
คุณสามารถใช้ 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));
}
}
หากคุณกำลังใช้อยู่net.sf.json.JSONObject
คุณจะไม่พบคอนJSONObject(map)
สตรัคเตอร์อยู่ คุณต้องใช้public static JSONObject fromObject( Object object )
วิธีการ วิธีนี้ยอมรับสตริงที่จัดรูปแบบของ JSON, Maps, DynaBeans และ JavaBeans
JSONObject jsonObject = JSONObject.fromObject(myMap);
ถ้าคุณใช้วัตถุที่ซับซ้อนคุณควรใช้enableComplexMapKeySerialization ()ตามที่ระบุไว้ในhttps://stackoverflow.com/a/24635655/2914140และhttps://stackoverflow.com/a/26374888/2914140
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"
}
ไม่จำเป็นต้องใช้ไลบรารีการแยกวิเคราะห์ 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 "{}";
}
}
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"]}
หากคุณไม่ต้องการ HashMap จริงๆคุณสามารถทำสิ่งนี้ได้:
String jsonString = new JSONObject() {{
put("firstName", user.firstName);
put("lastName", user.lastName);
}}.toString();
เอาท์พุท:
{
"firstName": "John",
"lastName": "Doe"
}
HashMap
และนี่ไม่ได้ตอบว่า
ฉันใช้ 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
ทุกอย่างปกติดี.
หากคุณใช้ JSR 374: Java API สำหรับการประมวลผล JSON (javax json) นี่ดูเหมือนจะเป็นการหลอกลวง:
JsonObjectBuilder job = Json.createObjectBuilder((Map<String, Object>) obj);
JsonObject jsonObject = job.build();
คุณสามารถใช้Gson ไลบรารีนี้มีวิธีง่าย ๆ ในการแปลงวัตถุ Java เป็นวัตถุ JSON และในทางกลับกัน
ตัวอย่าง:
GsonBuilder gb = new GsonBuilder();
Gson gson = gb.serializeNulls().create();
gson.toJson(object);
คุณสามารถใช้ GsonBuilder เมื่อคุณต้องการตั้งค่าตัวเลือกการกำหนดค่าอื่นนอกเหนือจากค่าเริ่มต้น ในตัวอย่างข้างต้นกระบวนการแปลงจะทำให้เป็นโมฆะแอตทริบิวต์จากวัตถุ
อย่างไรก็ตามวิธีนี้ใช้ได้กับประเภทที่ไม่ใช่ทั่วไปเท่านั้น สำหรับประเภททั่วไปคุณต้องใช้ toJson (object, Type)
ข้อมูลเพิ่มเติมเกี่ยวกับ Gson ที่นี่
โปรดจำไว้ว่าวัตถุนั้นต้องใช้อินเตอร์เฟสที่สามารถทำให้เป็นอนุกรมได้
สิ่งนี้ใช้ได้กับฉัน:
import groovy.json.JsonBuilder
properties = new Properties()
properties.put("name", "zhangsan")
println new JsonBuilder(properties).toPrettyString()
วิธี Gson สำหรับแผนที่และรายการที่ซับซ้อนขึ้นอีกเล็กน้อยโดยใช้วิธีTypeToken.getParameterized :
เรามีแผนที่ที่มีลักษณะดังนี้:
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();
จากนั้นใช้วัตถุ Gson จากวิธีJsonเช่นนี้โดยใช้วัตถุ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 ที่ถูก deserialized มีลักษณะเช่นนี้:
{
"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"
}
]
}
ฉันประสบปัญหาคล้ายกันเมื่อเลิกการตอบสนองจากคำสั่งที่กำหนดเองในซีลีเนียม คำตอบคือ json แต่ซีลีเนียมภายในแปลว่าเป็น java.util.HashMap [String, Object]
หากคุณคุ้นเคยกับสกาล่าและใช้ 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 จนกว่าจะพบประเภทพื้นฐาน (String, Integer, Boolean) ประเภทพื้นฐานเหล่านี้สามารถถูกห่อลงใน JsObject โดยตรง เมื่อการเรียกซ้ำถูกเปิดออกลึกลงไปจะเชื่อมต่อกับวัตถุที่สร้างขึ้น
'@unchecked' ดูแลคำเตือนการลบประเภท
ก่อนอื่นแปลงวัตถุทั้งหมดของคุณให้เป็นสตริงที่ถูกต้อง
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);
ตอนนี้คุณสามารถรับ JSON โดยเพียงแค่เรียก toString ของวัตถุ
postData.toString()
//{"arg1":"<b>some text<\/b>" "arg2":"object output"}
สร้าง JSONObject ใหม่
JSONObject o = new JSONObject(postData.toString());
หรือเป็นอาร์เรย์ไบต์สำหรับส่งผ่าน HTTP
postData.toString().getBytes("UTF-8");