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