我使用Java,我有一个JSON字符串:

{
"name" : "abc" ,
"email id " : ["abc@gmail.com","def@gmail.com","ghi@gmail.com"]
}

然后是我的Java地图:

Map<String, Object> retMap = new HashMap<String, Object>();

我想把所有来自JSONObject的数据存储在那个HashMap中。

有人能为此提供代码吗?我想用org。json库。


当前回答

如果你讨厌递归-使用Stack和javax。将一个json字符串转换成一个地图列表:

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;
import javax.json.Json;
import javax.json.stream.JsonParser;

public class TestCreateObjFromJson {
    public static List<Map<String,Object>> extract(InputStream is) {
        List extracted = new ArrayList<>();
        JsonParser parser = Json.createParser(is);

        String nextKey = "";
        Object nextval = "";
        Stack s = new Stack<>();
        while(parser.hasNext()) {
            JsonParser.Event event = parser.next();
            switch(event) {
                case START_ARRAY :  List nextList = new ArrayList<>();
                                    if(!s.empty()) {
                                        // If this is not the root object, add it to tbe parent object
                                        setValue(s,nextKey,nextList);
                                    }
                                    s.push(nextList);
                                    break;
                case START_OBJECT : Map<String,Object> nextMap = new HashMap<>();
                                    if(!s.empty()) {
                                        // If this is not the root object, add it to tbe parent object
                                        setValue(s,nextKey,nextMap);
                                    }
                                    s.push(nextMap);
                                    break;
                case KEY_NAME : nextKey = parser.getString();
                                break;
                case VALUE_STRING : setValue(s,nextKey,parser.getString());
                                    break;
                case VALUE_NUMBER : setValue(s,nextKey,parser.getLong());
                                    break;
                case VALUE_TRUE :   setValue(s,nextKey,true);
                                    break;
                case VALUE_FALSE :  setValue(s,nextKey,false);
                                    break;
                case VALUE_NULL :   setValue(s,nextKey,"");
                                    break;
                case END_OBJECT :   
                case END_ARRAY  :   if(s.size() > 1) {
                                        // If this is not a root object, move up
                                        s.pop(); 
                                    } else {
                                        // If this is a root object, add ir ro rhw final 
                                        extracted.add(s.pop()); 
                                    }
                default         :   break;
            }
        }

        return extracted;
    }

    private static void setValue(Stack s, String nextKey, Object v) {
        if(Map.class.isAssignableFrom(s.peek().getClass()) ) ((Map)s.peek()).put(nextKey, v);
        else ((List)s.peek()).add(v);
    }
}

其他回答

你也可以使用Jackson API:

    final String json = "....your json...";
    final ObjectMapper mapper = new ObjectMapper();
    final MapType type = mapper.getTypeFactory().constructMapType(
        Map.class, String.class, Object.class);
    final Map<String, Object> data = mapper.readValue(json, type);

您可以使用谷歌gson库转换json对象。

https://code.google.com/p/google-gson/‎

其他图书馆如Jackson也可以使用。

这不会将其转换为映射。但是你可以做任何你想做的事情。

如果你讨厌递归-使用Stack和javax。将一个json字符串转换成一个地图列表:

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;
import javax.json.Json;
import javax.json.stream.JsonParser;

public class TestCreateObjFromJson {
    public static List<Map<String,Object>> extract(InputStream is) {
        List extracted = new ArrayList<>();
        JsonParser parser = Json.createParser(is);

        String nextKey = "";
        Object nextval = "";
        Stack s = new Stack<>();
        while(parser.hasNext()) {
            JsonParser.Event event = parser.next();
            switch(event) {
                case START_ARRAY :  List nextList = new ArrayList<>();
                                    if(!s.empty()) {
                                        // If this is not the root object, add it to tbe parent object
                                        setValue(s,nextKey,nextList);
                                    }
                                    s.push(nextList);
                                    break;
                case START_OBJECT : Map<String,Object> nextMap = new HashMap<>();
                                    if(!s.empty()) {
                                        // If this is not the root object, add it to tbe parent object
                                        setValue(s,nextKey,nextMap);
                                    }
                                    s.push(nextMap);
                                    break;
                case KEY_NAME : nextKey = parser.getString();
                                break;
                case VALUE_STRING : setValue(s,nextKey,parser.getString());
                                    break;
                case VALUE_NUMBER : setValue(s,nextKey,parser.getLong());
                                    break;
                case VALUE_TRUE :   setValue(s,nextKey,true);
                                    break;
                case VALUE_FALSE :  setValue(s,nextKey,false);
                                    break;
                case VALUE_NULL :   setValue(s,nextKey,"");
                                    break;
                case END_OBJECT :   
                case END_ARRAY  :   if(s.size() > 1) {
                                        // If this is not a root object, move up
                                        s.pop(); 
                                    } else {
                                        // If this is a root object, add ir ro rhw final 
                                        extracted.add(s.pop()); 
                                    }
                default         :   break;
            }
        }

        return extracted;
    }

    private static void setValue(Stack s, String nextKey, Object v) {
        if(Map.class.isAssignableFrom(s.peek().getClass()) ) ((Map)s.peek()).put(nextKey, v);
        else ((List)s.peek()).add(v);
    }
}

使用Gson,你可以做以下事情:

Map<String, Object> retMap = new Gson().fromJson(
    jsonString, new TypeToken<HashMap<String, Object>>() {}.getType()
);

最新更新:我已经使用fastxmljackson Databind2.12.3转换JSON字符串到映射,映射到JSON字符串。

// javax.ws.rs.core.Response clientresponse = null; // Read JSON with Jersey 2.0 (JAX-RS 2.0)
// String json_string = clientresponse.readEntity(String.class);
String json_string = "[\r\n"
        + "{\"domain\":\"stackoverflow.com\", \"userId\":5081877, \"userName\":\"Yash\"},\r\n"
        + "{\"domain\":\"stackoverflow.com\", \"userId\":6575754, \"userName\":\"Yash\"}\r\n"
        + "]";
System.out.println("Input/Response JSON string:"+json_string);
ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper();
//java.util.Map<String, String> map = mapper.readValue(json_string, java.util.Map.class);
List<Map<String, Object>> listOfMaps = mapper.readValue(json_string, new com.fasterxml.jackson.core.type.TypeReference< List<Map<String, Object>>>() {});

System.out.println("fasterxml JSON string to List of Map:"+listOfMaps);

String json = mapper.writeValueAsString(listOfMaps);
System.out.println("fasterxml List of Map to JSON string:[compact-print]"+json);

json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(listOfMaps);
System.out.println("fasterxml List of Map to JSON string:[pretty-print]"+json);

输出:

Input/Response JSON string:[
{"domain":"stackoverflow.com", "userId":5081877, "userName":"Yash"},
{"domain":"stackoverflow.com", "userId":6575754, "userName":"Yash"}
]
fasterxml JSON string to List of Map:[{domain=stackoverflow.com, userId=5081877, userName=Yash}, {domain=stackoverflow.com, userId=6575754, userName=Yash}]
fasterxml List of Map to JSON string:[compact-print][{"domain":"stackoverflow.com","userId":5081877,"userName":"Yash"},{"domain":"stackoverflow.com","userId":6575754,"userName":"Yash"}]
fasterxml List of Map to JSON string:[pretty-print][ {
  "domain" : "stackoverflow.com",
  "userId" : 5081877,
  "userName" : "Yash"
}, {
  "domain" : "stackoverflow.com",
  "userId" : 6575754,
  "userName" : "Yash"
} ]

将JSON字符串转换为Map

public static java.util.Map<String, Object> jsonString2Map( String jsonString ) throws org.json.JSONException {
    Map<String, Object> keys = new HashMap<String, Object>(); 
    
    org.json.JSONObject jsonObject = new org.json.JSONObject( jsonString ); // HashMap
    java.util.Iterator<?> keyset = jsonObject.keys(); // HM
    
    while (keyset.hasNext()) {
        String key =  (String) keyset.next();
        Object value = jsonObject.get(key);
        System.out.print("\n Key : "+key);
        if ( value instanceof org.json.JSONObject ) {
            System.out.println("Incomin value is of JSONObject : ");
            keys.put( key, jsonString2Map( value.toString() ));
        } else if ( value instanceof org.json.JSONArray) {
            org.json.JSONArray jsonArray = jsonObject.getJSONArray(key);
            //JSONArray jsonArray = new JSONArray(value.toString());
            keys.put( key, jsonArray2List( jsonArray ));
        } else {
            keyNode( value);
            keys.put( key, value );
        }
    }
    return keys;
}

将JSON数组转换为列表

public static java.util.List<Object> jsonArray2List( org.json.JSONArray arrayOFKeys ) throws org.json.JSONException {
    System.out.println("Incoming value is of JSONArray : =========");
    java.util.List<Object> array2List = new java.util.ArrayList<Object>();
    for ( int i = 0; i < arrayOFKeys.length(); i++ )  {
        if ( arrayOFKeys.opt(i) instanceof org.json.JSONObject ) {
            Map<String, Object> subObj2Map = jsonString2Map(arrayOFKeys.opt(i).toString());
            array2List.add(subObj2Map);
        } else if ( arrayOFKeys.opt(i) instanceof org.json.JSONArray ) {
            java.util.List<Object> subarray2List = jsonArray2List((org.json.JSONArray) arrayOFKeys.opt(i));
            array2List.add(subarray2List);
        } else {
            keyNode( arrayOFKeys.opt(i) );
            array2List.add( arrayOFKeys.opt(i) );
        }
    }
    return array2List;
}
public static Object keyNode(Object o) {
    if (o instanceof String || o instanceof Character) return (String) o;
    else if (o instanceof Number) return (Number) o;
    else return o;
}

显示任意格式的JSON

public static void displayJSONMAP( Map<String, Object> allKeys ) throws Exception{
    Set<String> keyset = allKeys.keySet(); // HM$keyset
    if (! keyset.isEmpty()) {
        Iterator<String> keys = keyset.iterator(); // HM$keysIterator
        while (keys.hasNext()) {
            String key = keys.next();
            Object value = allKeys.get( key );
            if ( value instanceof Map ) {
                System.out.println("\n Object Key : "+key);
                    displayJSONMAP(jsonString2Map(value.toString()));
            }else if ( value instanceof List ) {
                System.out.println("\n Array Key : "+key);
                JSONArray jsonArray = new JSONArray(value.toString());
                jsonArray2List(jsonArray);
            }else {
                System.out.println("key : "+key+" value : "+value);
            }
        }
    }    
    
}

谷歌。gson到HashMap。