Java JSONObject——检索任意属性
我试图调试以下代码,这些代码可以检索JSONObject的任意属性 当尝试访问超过一级深度的JSON时失败。 例如,如果传入的JSONObject称为“node”,并且它有一个具有属性的“subnode”,那么它将失败 因此,在这个示例中,有一个访问器“Java JSONObject——检索任意属性,java,json,jsonobject,Java,Json,Jsonobject,我试图调试以下代码,这些代码可以检索JSONObject的任意属性 当尝试访问超过一级深度的JSON时失败。 例如,如果传入的JSONObject称为“node”,并且它有一个具有属性的“subnode”,那么它将失败 因此,在这个示例中,有一个访问器“node.subnode.property” 我想事情就是这样 record = ((JSONObject)record).get(key); 正在返回字符串--此时记录不是JSONObject或JSONArray。 所以下次通过for循环时,
node.subnode.property
”
我想事情就是这样
record = ((JSONObject)record).get(key);
正在返回字符串--此时记录不是JSONObject
或JSONArray
。
所以下次通过for循环时,它找不到属性
解决这个问题的最佳方法是什么?该方法不应该知道正在访问的JSONObject的内容
public final Object getJSONValue(JSONObject jsonObject, String accessor)
{
String[] keys = accessor.split("\\.");
Object record = jsonObject;
for (String key : keys)
{
if ((record instanceof JSONObject))
{
record = ((JSONObject)record).get(key);
}
else if ((record instanceof JSONArray))
{
record = ((JSONArray)record).get(Integer.parseInt(key));
}
else
{
return null;
}
}
return record;
}
注意,我使用的是
org.json.simple.JSONObject
您能提供一个函数返回错误结果的输入吗?else if((record instanceof JSONArray))永远无法执行。jsonObject的类型是jsonObject(在参数列表中定义),因此if((记录jsonObject的实例))测试将始终为true。这同样适用于最后一个else(它不可能发生)。我建议在“else”块中引发一个异常。因为执行将到达该分支的唯一原因是“访问器”包含不正确的字段序列。第二个原因是,您可能希望区分失败情况(不正确的访问器)和字段值为null的情况。不要将jsonObject
强制转换为Object
,并使用thanjsonObject#getJsonObject()
进行属性访问,然后使用getValueType()
确定属性类型。这是类型安全的变体。谢谢您的评论。不幸的是,getJsonObject()在我使用的org.json.simple.JSONObject中不可用。我确实是通过将get(key)返回的字符串通过JSONParser发送回来的,尽管这样做的代码看起来很混乱。