Java JSONObject——检索任意属性

Java JSONObject——检索任意属性,java,json,jsonobject,Java,Json,Jsonobject,我试图调试以下代码,这些代码可以检索JSONObject的任意属性 当尝试访问超过一级深度的JSON时失败。 例如,如果传入的JSONObject称为“node”,并且它有一个具有属性的“subnode”,那么它将失败 因此,在这个示例中,有一个访问器“node.subnode.property” 我想事情就是这样 record = ((JSONObject)record).get(key); 正在返回字符串--此时记录不是JSONObject或JSONArray。 所以下次通过for循环时,

我试图调试以下代码,这些代码可以检索JSONObject的任意属性

当尝试访问超过一级深度的JSON时失败。 例如,如果传入的JSONObject称为“node”,并且它有一个具有属性的“subnode”,那么它将失败

因此,在这个示例中,有一个访问器“
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
,并使用than
jsonObject#getJsonObject()
进行属性访问,然后使用
getValueType()
确定属性类型。这是类型安全的变体。谢谢您的评论。不幸的是,getJsonObject()在我使用的org.json.simple.JSONObject中不可用。我确实是通过将get(key)返回的字符串通过JSONParser发送回来的,尽管这样做的代码看起来很混乱。