[英]Convert a JSON object to a Map object
我有一個JSON對象,其外觀如下:
[{"var1":"value1","var2":"value2"},{"var2":"value22","var3":[["0","1","2"],["3","4","5"],["6","7","8"]]}]
(注意: var2
在示例和var3
值的復數形式中出現了兩次。)
所需的輸出應該是一個地圖對象,例如:
key value
var1 value1
var2 value2,value22
var3 [["0","1","2"],["3","4","5"],["6","7","8"]]
我想要將其轉換為一個地圖對象,其中第一個元素( var1
, var2
, var3
)作為鍵,而對應的值作為地圖中的值。 在具有相同鍵(例如var2
)的情況下,屬於該鍵的兩個值應串聯在一起,但要用逗號分隔。
有人可以幫我弄這個嗎?
您可以使用Jackson來回轉換JSON和Map。 使用以下代碼並實例化JSonAdapter類,使用方法marshal(String)
將json字符串轉換為map,然后將unmarshall(Map)
為反之。
import java.io.IOException;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonAdapter {
private static final ObjectMapper MAPPER = new ObjectMapper();
public String unmarshal(final Map<?, ?> jsonList) throws Exception {
return MAPPER.writeValueAsString(jsonList);
}
public Map<?, ?> marshal(final String jsonString) throws Exception {
try {
return MAPPER.readValue(jsonString, new TypeReference<Map<?, ?>>() {
});
} catch (final IOException e) {
e.printStackTrace();
}
return null;
}
}
您不需要適配器即可解析json。 您只需要告訴ObjectMapper確切的解析類型即可。 您還需要一些后期處理,因為您需要一些有關重復鍵的特殊處理
您可以從GIT獲得Jackson: https : //github.com/FasterXML/jackson
這是為您提供的完整解決方案:
import java.util.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.type.TypeFactory;
public class Test
{
public static void main(String[] args)
{
String input = "[{\"var1\":\"value1\",\"var2\":\"value2\"},{\"var2\":\"value22\",\"var3\":[[\"0\",\"1\",\"2\"],[\"3\",\"4\",\"5\"],[\"6\",\"7\",\"8\"]]}]" ;
Map<String, String> result = new HashMap<>(); // final result, with duplicate keys handles and everything
try {
// ObjectMapper is Jackson json parser
ObjectMapper om = new ObjectMapper();
// we need to tell ObjectMapper what type to parse into
// in this case: list of maps where key is string and value is some cimplex Object
TypeFactory tf = om.getTypeFactory();
JavaType mapType = tf.constructMapType(HashMap.class, String.class, Object.class);
JavaType listType = tf.constructCollectionType(List.class, mapType);
@SuppressWarnings("unchecked")
// finally we parse the input into the data struct
List<Map<String, Object>> list = (List<Map<String, Object>>)om.readValue(input, listType);
// post procesing: populate result, taking care of duplicates
for (Map<String, Object> listItem : list) {
for (Map.Entry<String, Object> mapItem : listItem.entrySet()) {
String key = mapItem.getKey();
String value = mapItem.getValue().toString();
if (result.containsKey(key)) value = result.get(key) + "," + value;
result.put(key, value);
}
}
// result sohuld hold expected outut now
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出:
{var3=[[0, 1, 2], [3, 4, 5], [6, 7, 8]], var2=value2,value22, var1=value1}
沒有預定義的API可以執行操作,您必須編寫自己的解析器才能將JSONObject
轉換為Map
。
請參閱以下提示:
public static Map<String, Object> toMap(JSONObject object) throws JSONException{
Map<String, List<String>> map = new HashMap<String, List<String>>();
Iterator<String> keysIterator = object.keys();
while(keysIterator .hasNext()) {
String key = keysIterator.next();
Object value = object.get(key);
if(map.contains(key)){
... //do your task
}
... //get value of the key
map.put(key, yourValue)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.