如何获得动态更改的密钥';使用java的Json字符串中的s值
我试图用java解析Json字符串,我遇到了一些场景 下面是我的JSON字符串:如何获得动态更改的密钥';使用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",
"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);
}