示例:
{"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中的所有项都具有“本机”值。这是我当前提取“名称”值
的代码JSONObject json = new JSONObject(readUrl(url.toString()));
JSONArray jsonArray = json.getJSONArray("libraries");
ArrayList<String> libraries = new ArrayList<String>();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject next = jsonArray.getJSONObject(i);
String lib = next.getString("name");
libraries.add(lib);
}
由于我不熟悉java / JSON解析,所以我不确定这一点,但数组中没有“natives”值的对象会导致程序结束吗?
答案 0 :(得分:1)
您可以使用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:here
答案 1 :(得分:1)
您似乎想要在JSON Pointer s /name
和/extract/natives/windows
提取内容。
在这种情况下,使用this library(取决于杰克逊),就像这样简单:
// 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()
:
if (windowsNode.isMissingNode())
// deal with no windows content
或者,使用.get()
代替.path()
,然后检查null
。