JSON을 맵으로 변환
JSON 코드를 다음과 같이 변환하는 가장 좋은 방법은?
{
"data" :
{
"field1" : "value1",
"field2" : "value2"
}
}
Java Map에서 키 하나는 (필드1, 필드2)이고 그 필드 값은 (값1, 값2)이다.
좋은 생각 있어?쟈슨립으로 할까?아니면 나만의 파서를 쓰는 게 낫지?
파서를 직접 쓴다는 농담이었기를 바란다 :-)
이렇게 간단한 매핑을 위해서는 http://json.org(섹션 자바)의 대부분의 툴이 작동할 것이다.그 중 한 명(Jackson https://github.com/FasterXML/jackson-databind/#5분짜리 https://github.com/FasterXML/jackson-databind/)에 대해 다음과 같이 하십시오.
Map<String,Object> result =
new ObjectMapper().readValue(JSON_SOURCE, HashMap.class);
(여기서 JSON_SOURCE는 파일, 입력 스트림, 판독기 또는 json 컨텐츠 문자열)
GSON 라이브러리 사용:
import com.google.gson.Gson;
import com.google.common.reflect.TypeToken;
import java.lang.reclect.Type;
다음 코드를 사용하십시오.
Type mapType = new TypeToken<Map<String, Map>>(){}.getType();
Map<String, String[]> son = new Gson().fromJson(easyString, mapType);
나는 구글 gson 도서관을 좋아한다.
json의 구조를 모를 때.사용할 수 있다
JsonElement root = new JsonParser().parse(jsonString);
그런 다음 json과 함께 작업할 수 있다. 예를 들어 gson으로부터 "value1"을 얻는 방법:
String value1 = root.getAsJsonObject().get("data").getAsJsonObject().get("field1").getAsString();
JSON lib 예: http://www.json.org/java/를 사용하십시오.
// Assume you have a Map<String, String> in JSONObject jdata
@SuppressWarnings("unchecked")
Iterator<String> nameItr = jdata.keys();
Map<String, String> outMap = new HashMap<String, String>();
while(nameItr.hasNext()) {
String name = nameItr.next();
outMap.put(name, jdata.getString(name));
}
내 포스트는 다른 사람들에게 도움이 될 수 있으니, 여러분이 특정한 가치관을 가진 지도를 가지고 있다고 상상해보라.
{
"shopping_list":{
"996386":{
"id":996386,
"label":"My 1st shopping list",
"current":true,
"nb_reference":6
},
"888540":{
"id":888540,
"label":"My 2nd shopping list",
"current":false,
"nb_reference":2
}
}
}
이 JSON 파일을 GSON 라이브러리와 구문 분석하려면 프로젝트를 축소하면 된다.
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
그런 다음 다음 이 코드 조각을 사용하십시오.
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
//Read the JSON file
JsonElement root = new JsonParser().parse(new FileReader("/path/to/the/json/file/in/your/file/system.json"));
//Get the content of the first map
JsonObject object = root.getAsJsonObject().get("shopping_list").getAsJsonObject();
//Iterate over this map
Gson gson = new Gson();
for (Entry<String, JsonElement> entry : object.entrySet()) {
ShoppingList shoppingList = gson.fromJson(entry.getValue(), ShoppingList.class);
System.out.println(shoppingList.getLabel());
}
해당 POJO는 다음과 같은 것이어야 한다.
public class ShoppingList {
int id;
String label;
boolean current;
int nb_reference;
//Setters & Getters !!!!!
}
그것이 도움이 되기를!
이렇게 하면 지도처럼...
JSONObject fieldsJson = new JSONObject(json);
String value = fieldsJson.getString(key);
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.1</version>
</dependency>
나는 이런 식으로 한다.심플하다.
import java.util.Map;
import org.json.JSONObject;
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
JSONObject jsonObj = new JSONObject("{ \"f1\":\"v1\"}");
@SuppressWarnings("unchecked")
Map<String, String> map = new Gson().fromJson(jsonObj.toString(),Map.class);
System.out.println(map);
}
}
구글의 Gson 2.7(아마도 이전 버전이지만 나는 2.7을 테스트했다)을 사용하면 다음과 같이 간단하다.
Map map = gson.fromJson(json, Map.class);
유형 맵을 반환하는 경우class com.google.gson.internal.LinkedTreeMap
중첩된 객체에 대해 반복적으로 작업한다.
java.lang.reflect.Type mapType = new TypeToken<Map<String, Object>>(){}.getType();
Gson gson = new Gson();
Map<String, Object> categoryicons = gson.fromJson(json, mapType );
JsonTools 라이브러리는 매우 완벽하다.그것은 기투브에서 찾을 수 있다.
org.json을 사용하고 있다면 JSONObject에는 방법이 있다.toMap()
쉽게 수행할 수 있는 작업:
Map<String, Object> myMap = myJsonObject.toMap();
다른 대안은 메이븐 센트럴에서 찾을 수 있는 json-simple이다.
(JSONObject)JSONValue.parse(someString); //JSONObject is actually a Map.
아티팩트는 24kbytes로 다른 런타임 종속성을 가지고 있지
다음 코드 사용:
public static Map<String, Object> convertJsonIntoMap(String jsonFile) {
Map<String, Object> map = new HashMap<>();
try {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
mapper.readValue(jsonFile, new TypeReference<Map<String, Object>>() {
});
map = mapper.readValue(jsonFile, new TypeReference<Map<String, String>>() {
});
} catch (IOException e) {
e.printStackTrace();
}
return map;
}
JSON to Map은 항상 문자열/객체 데이터 유형임.나는 구글의 GSON lib를 가지고 있다.복잡한 오브젝트를 위해 작업하지 않고 문자열로 작업하는 Gson 라이브러리 다른 작업
import net.sf.json.JSONObject
JSONObject.fromObject(yourJsonString).toMap
종속성이 없는 순수 자바(Java)가 필요한 경우 자바 8에서 나시온 API 빌드를 사용할 수 있다.그것은 자바 11에서 더 이상 사용되지 않는다.
이건 내게 효과가 있어:
...
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
...
public class JsonUtils {
public static Map parseJSON(String json) throws ScriptException {
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
String script = "Java.asJSONCompatible(" + json + ")";
Object result = engine.eval(script);
return (Map) result;
}
}
샘플 사용법
JSON:
{
"data":[
{"id":1,"username":"bruce"},
{"id":2,"username":"clark"},
{"id":3,"username":"diana"}
]
}
코드:
...
import jdk.nashorn.internal.runtime.JSONListAdapter;
...
public static List<String> getUsernamesFromJson(Map json) {
List<String> result = new LinkedList<>();
JSONListAdapter data = (JSONListAdapter) json.get("data");
for(Object obj : data) {
Map map = (Map) obj;
result.add((String) map.get("username"));
}
return result;
}
밑줄-자바 라이브러리는 json 문자열을 해시 맵으로 변환할 수 있다.나는 그 프로젝트의 유지 관리인이다.
코드 예제:
import com.github.underscore.U;
import java.util.*;
public class Main {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String json = "{"
+ " \"data\" :"
+ " {"
+ " \"field1\" : \"value1\","
+ " \"field2\" : \"value2\""
+ " }"
+ "}";
Map<String, Object> data = (Map) U.get((Map<String, Object>) U.fromJson(json), "data");
System.out.println(data);
// {field1=value1, field2=value2}
}
}
JSON to Map은 항상 문자열/객체 데이터 유형임.나는 구글에서 GSON lib를 얻었다.
매우 잘 작동하고 JDK 1.5가 최소 요구 사항이다.
참조URL: https://stackoverflow.com/questions/443499/convert-json-to-map
'Programing' 카테고리의 다른 글
TypeError: vue-resource 사용 시 t.replace가 함수 오류가 아님 (0) | 2022.04.19 |
---|---|
C의 "자유"는 왜 자유로워지는 바이트 수를 가져가지 않는가? (0) | 2022.04.19 |
확인란을 Vuex 저장소에 바인딩하는 방법? (0) | 2022.04.19 |
자바에서 더블틸드(~~)의 의미는 무엇인가? (0) | 2022.04.19 |
VueJS 라이프사이클에서 소품 업데이트 시기 (0) | 2022.04.19 |