簡體   English   中英

將JSON對象轉換為Map對象

[英]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"]]

我想要將其轉換為一個地圖對象,其中第一個元素( var1var2var3 )作為鍵,而對應的值作為地圖中的值。 在具有相同鍵(例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM