Відповіді:
Ви можете використовувати:
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"
}
Ви також можете спробувати використовувати Google GSON.Google GSON - найкраща бібліотека для перетворення об’єктів Java в їх представлення 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 залежності для 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>
Сподіваюсь, це допоможе. Щасливе кодування.
У моєму випадку я не хотів ніяких залежностей. Використовуючи 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;
}
Підкреслювальна-java- бібліотека може конвертувати хеш-карту чи список масивів у 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"
// }
}
}
Пізно на вечірку, але ось мій письменник adonc GSON для серіалізації хешмапу. Мені довелося записати карту пар ключів-значень як атрибутів рядка json, очікуючи, що один тип буде цілим числом. Я не хотів створювати власні оболонки JavaBean для цього простого використання.
Клас GSON JsonWriter - простий у використанні клас серіалізаторів, що містить декілька сильно набраних функцій write.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 бібліотека трохи менше 190 КБ без жорстоких залежностей. Легкий у використанні на будь-якому користувацькому додатку сервлетів або окремому додатку без великих інтеграцій рамок.
Gson gson = new Gson();
String json = gson.toJson(myMap);
Краще запізнитися, ніж ніколи. Я використовував 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.
Це рішення працює зі складними 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
Все добре.
Можна використовувати Gson . Ця бібліотека пропонує прості методи перетворення об’єктів Java в об'єкти JSON і навпаки.
Приклад:
GsonBuilder gb = new GsonBuilder();
Gson gson = gb.serializeNulls().create();
gson.toJson(object);
Ви можете використовувати GsonBuilder, коли потрібно встановити інші параметри конфігурації, ніж стандартні. У наведеному вище прикладі процес перетворення також буде серіалізувати нульові атрибути від об'єкта.
Однак такий підхід працює лише для непородних типів. Для загальних типів потрібно використовувати toJson (object, Type).
Більше інформації про Gson тут .
Пам'ятайте, що об'єкт повинен реалізувати інтерфейс Serializable .
це працює для мене:
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 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"
}
]
}
Я зіткнувся з подібною проблемою, коли десеріалізував Відповідь з користувацьких команд у селені. Відповідь була json, але селен внутрішньо перекладає це на java.util.HashMap [String, Object]
Якщо ви знайомі з scala та використовуєте 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. Коли рекурсія розгортається, глибинне об'єднання об'єднує створені об'єкти.
"@uncked" піклується про попередження про стирання типу.
Спочатку конвертуйте всі об'єкти у дійсні рядки
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");