Java 从JSON提取值时遇到问题

Java 从JSON提取值时遇到问题,java,json,parsing,Java,Json,Parsing,示例: {"name":"tv.twitch:twitch:5.16"} {"name":"tv.twitch:twitch-external-platform:4.5","extract":{"exclude":["META-INF/"]},"natives":{"windows":"natives-windows-${arch}"},"rules":[{"os":{"name":"windows"},"action":"allow"}]} 这些行来自JSONArray,我想提取“本地人”

示例:

{"name":"tv.twitch:twitch:5.16"}

{"name":"tv.twitch:twitch-external-platform:4.5","extract":{"exclude":["META-INF/"]},"natives":{"windows":"natives-windows-${arch}"},"rules":[{"os":{"name":"windows"},"action":"allow"}]}
这些行来自JSONArray,我想提取“本地人”部分。问题是,并非JSONArray中的所有项都具有“natives”值。下面是我当前提取“name”值的代码

jsonobjectjson=newjsonobject(readUrl(url.toString());
JSONArray JSONArray=json.getJSONArray(“库”);
ArrayList库=新的ArrayList();
for(int i=0;i

我不太清楚这一点,因为我是java/JSON解析新手,但是数组中没有“natives”值的对象会导致程序结束吗?

您可以使用JSONObject中的
has
方法来确定它是否包含指定的键

确定JSONObject是否包含特定的键

在您的情况下,您可以这样做:

JSONObject json = new JSONObject(readUrl(url.toString()));
if(json.has("natives")) {
   //Logic to extract natives
} else {
   //Logic to extract without natives
}

我认为这些简单的线路应该足以满足您的要求。请参阅API:

您似乎想在s
/name
/extract/natives/windows
提取内容

在本例中,使用(取决于Jackson),简单如下:

// All of these are thread safe
private static final ObjectReader READER = JacksonUtils.getReader();
private static final JsonPointer NAME_POINTER = JsonPointer.of("name");
private static final JsonPointer WINDOWS_POINTER 
    = JsonPointer.of("extract", "native", "windows");

// Fetch content from URL
final JsonNode content = READER.readTree(url.getInputStream());
// Get content at pointers, if any
final JsonNode nameNode = NAME_POINTER.path(content);
final JsonNode windowsNode = WINDOWS_POINTER.path(content);
然后,要检查节点是否确实存在,请对照
.isMissingNode()


或者,使用
.get()
而不是
.path()
并检查
null

如果您使用的是
json.org
JSONObject
有一个
has(String)
方法,用于确定键是否存在。我需要“名称”、“本机”,在这种情况下,“windows”只需使用
try catch
块即可获得“本机”值。不清楚上面的JSON中有什么对象。它是循环中的下一个JSON对象吗?如果是这样的话,那么您所拥有的应该是有效的。捕获异常(事实上构造)是一项非常昂贵的操作,测试是否存在比捕获NullPointerExceptionYes要好。这正是我在qqilihq提到“has”方法后所做的
// All of these are thread safe
private static final ObjectReader READER = JacksonUtils.getReader();
private static final JsonPointer NAME_POINTER = JsonPointer.of("name");
private static final JsonPointer WINDOWS_POINTER 
    = JsonPointer.of("extract", "native", "windows");

// Fetch content from URL
final JsonNode content = READER.readTree(url.getInputStream());
// Get content at pointers, if any
final JsonNode nameNode = NAME_POINTER.path(content);
final JsonNode windowsNode = WINDOWS_POINTER.path(content);
if (windowsNode.isMissingNode())
    // deal with no windows content