如何获得动态更改的密钥';使用java的Json字符串中的s值

如何获得动态更改的密钥';使用java的Json字符串中的s值,java,Java,我试图用java解析Json字符串,我遇到了一些场景 下面是我的JSON字符串: "NetworkSettings": { "Ports": { "8080/tcp": [ // It will change dynamically like ("8125/udp" and "8080/udp" etc....) { "HostIp": "0.0.0.0",

我试图用java解析Json字符串,我遇到了一些场景

下面是我的JSON字符串:

"NetworkSettings": {
                "Ports": {
            "8080/tcp": [   // It will change dynamically like ("8125/udp" and "8080/udp" etc....)
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "8080"
                }
            ]
        }
    }
我尝试使用以下代码解析上述json字符串:

JsonObject NetworkSettings_obj=(JsonObject)obj.get("NetworkSettings");
if(NetworkSettings_obj.has("Ports"))
                {
                    JsonObject ntw_Ports_obj=(JsonObject)NetworkSettings_obj.get("Ports");
                    if(ntw_Ports_obj.has("8080/tcp"))
                    {
                        JsonArray arr_ntwtcp=(JsonArray)ntw_Ports_obj.get("8080/tcp");                          
                        JsonObject ntwtcp_obj=arr_ntwtcp.get(0).getAsJsonObject();
                        if(ntwtcp_obj.has("HostIp"))
                        {
                            ntw_HostIp=ntwtcp_obj.get("HostIp").toString();
                            System.out.println("Network HostIp = "+ntw_HostIp);
                        }
                        if(ntwtcp_obj.has("HostPort"))
                        {
                            ntw_HostPort=ntwtcp_obj.get("HostPort").toString();                     
                            System.out.println("Network HostPort = "+ntw_HostPort);
                        }
                    }
                    else
                    {
                        ntw_HostIp="NA";
                        ntw_HostPort="NA";
                    }
                }
                else
                {
                    ntw_HostIp="NA";
                    ntw_HostPort="NA";
                }  
在我的代码中,我使用了这个代码

JsonArray arr_ntwtcp=(JsonArray)ntw_Ports_obj.get("8080/tcp");
获取“8080/tcp”的值

如何获取动态更改键的值,如(“8125/udp”、“8134/udp”等)

注意:我正在使用gson库进行解析

修改后

public static void main(String args[])
    {
        try
        {
            JsonParser parser = new JsonParser();
            JsonObject obj=(JsonObject)parser.parse(new FileReader("sampleJson.txt"));
            System.out.println("obj = "+obj);
            JsonObject NetworkSettings_obj=(JsonObject)obj.get("NetworkSettings");
            if(NetworkSettings_obj.has("Ports"))
            {
                JsonObject ntw_Ports_obj=(JsonObject)NetworkSettings_obj.get("Ports");
                System.out.println("ntw_Ports_obj = "+ntw_Ports_obj);
                Object keyObjects = new Gson().fromJson(ntw_Ports_obj, Object.class);
                List keys = new ArrayList();
                System.out.println(keyObjects instanceof Map);  //**** here the statement prints false
                if (keyObjects instanceof Map)        // *** so controls doesn't enters into the if() condition block *** //
                {
                    Map map = (Map) keyObjects;
                    System.out.println("Map = "+map);
                    keys.addAll(map.keySet());
                    String key = (String) keys.get(0);
                    JsonArray jArray = (JsonArray) ntw_Ports_obj.get(key);
                    System.out.println("Array List = "+jArray);
                }
            }
        }
        catch(Exception e)
        {

        }

    }

您可以这样做(未经测试,但应该可以):


因此,您的问题是键
8080/tcp
没有固定,它可能会改变。在这种情况下,您可以这样尝试获取
动态键的值

Set<Map.Entry<String, JsonElement>> entrySet = ntw_Ports_obj
                .entrySet();

for (Map.Entry<String, JsonElement> entry : entrySet) {
    String key = entry.getKey();
    JsonArray jArray = (JsonArray) ntw_Ports_obj.get(key);
    System.out.println(jArray);
}

它给出了一个错误,比如“无法从JsonObject强制转换到JsonArray”,我不希望泛型是迭代器,因为我使用的是旧版本的jdk@ksap然后您可以使用
entrySet()
检查我的新答案谢谢回复,它在新的jdk版本中工作,但在我的工作区,我们使用的是旧版本jdk(1.3),因此泛型(Map.Entry)和循环(for(Map.Entry:entrySet))不支持它。我必须用旧版本编译我的代码。我无法使用它。给我一个如下错误:java.lang.IndexOutOfBoundsException:Index:0,Size:0位于java.util.ArrayList.RangeCheck(未知源代码)位于java.util.ArrayList.get(未知源代码)位于InspectParsing.main(InspectParsing.java:610)@ksapi是否有任何方法可以直接从gson库中的Json字符串获取密钥?即“8080/tcp”。类似于JSONObject.keySet();在JSON简单库中。
Set<Map.Entry<String, JsonElement>> entrySet = ntw_Ports_obj
                .entrySet();

for (Map.Entry<String, JsonElement> entry : entrySet) {
    String key = entry.getKey();
    JsonArray jArray = (JsonArray) ntw_Ports_obj.get(key);
    System.out.println(jArray);
}
Object keyObjects = new Gson().fromJson(ntw_Ports_obj, Object.class);
List keys = new ArrayList();

/** for the given json there is a one json object within the 'Ports' so the 'keyObjects' will be the 'Map'**/
if (keyObjects instanceof Map) {
    Map map = (Map) keyObjects;
    keys.addAll(map.keySet());
    /**
     * keys is a List it may contain more than 1 value, but for the given
     * json it will contain only one value
     **/
    String key = (String) keys.get(0);
    JsonArray jArray = (JsonArray) ntw_Ports_obj.get(key);
    System.out.println(jArray);
}