【问题标题】:Android: Access all nested JSON objects dynamically [duplicate]Android:动态访问所有嵌套的 JSON 对象 [重复]
【发布时间】:2018-01-25 11:33:26
【问题描述】:

我已经检查了 SO 中的几乎所有帖子,但我没有得到解决方案

问题:我有如下 JSON 格式

{
  "address": {
    "state": "World",
    "address": "infinite space, 000",
    "city": "Android city",
    "address2": {
      "state": "World2",
      "address": "infinite space2, 002",
      "city": "Android city2",
      "address3": {
        "state": "World3",
        "address": "infinite space3, 003",
        "city": "Android city3"
      }
    }
  },
  "valid": {
    "state": "World",
    "address": "infinite space, 000",
    "city": "Android city",
    "valid2": {
      "state": "World2",
      "address": "infinite space2, 002",
      "city": "Android city2",
      "valid3": {
        "state": "World3",
        "address": "infinite space3, 003",
        "city": "Android city3"
      }
    }
  }
}

在这里,每个对象名称都是唯一的,将来我可能还会有许多嵌套的 JSON 对象。

我的要求是:我想动态解析每个嵌套的 JSON 对象。

例如:如果我传递任何对象名称。我的方法必须返回该对象的每个数据(键和值),或者从 JSON 中删除每个嵌套对象并超级维护它们

【问题讨论】:

  • 看起来很简单。您发布的 json 看起来也无效......但无论如何......你知道关键是什么吗?你必须遍历 while(key.hasNext()) if (key.equals(string){do something}
  • 这是一个有效的JSON,但不是一个授权的。如果我使用hasNext() 我可以解析它,但我必须循环内部对象的条件。除此之外你还有什么更好的解决方案
  • @down voters:在这个问题上说错了,我不会再重复了,但不评论为什么你们投票反对
  • 你被否决了,因为我们想看看你有什么解决方案,然后我们可以帮助修复代码,而不是我们给你解决方案。你在创建json并存储它吗?它是静态的还是变化的?如果它是静态的,也许将它重新设计成一个简单的数组。 PS会更快->我没有投反对票。 :)
  • @DroiDev 谢谢你的想法。我会按照你的方式尝试,非常感谢你没有否决我的问题;-)

标签: android json


【解决方案1】:

最好的选择是使用类而不是使用 Json Objec。我建议您使用 Gson 库将 json 响应转换为类

格森https://github.com/google/gson

如果您向服务器发出请求,Gson + Retrofit 2 也是不错的选择。

改造 2 http://square.github.io/retrofit/

【讨论】:

  • 您好 Emmanuel Montiel Martínez,感谢您的宝贵回复。不介意的话可以举个例子吗
  • 关注这个教程code.tutsplus.com/tutorials/…你可以搜索其他关于Retrofit 2的教程。第一次有点乏味,但最后向服务器发出请求是一个很好的选择
  • 谢谢 Emmanuel Montiel Martínez:-)
【解决方案2】:

感谢 DroiDev 和 MohamedMohaideenAH。终于找到解决办法了

private void parseJson(JSONObject jsonObject){

    try {

        for(int i = 0; i < jsonObject.length(); i++){


            if(jsonObject.get(jsonObject.names().getString(i)) instanceof JSONObject){

                Log.e("===Start===", "===Start===");

                Log.e("objectName", jsonObject.names().getString(i));

                JSONObject  singleObj = new JSONObject(jsonObject.get(jsonObject.names().getString(i)).toString());

                Iterator<String> keys= singleObj.keys();
                while (keys.hasNext()){
                    String keyValue = keys.next();
                    String valueString = singleObj.getString(keyValue);

                    if(!isJSONObjectOrString(valueString))
                        Log.e(keyValue, valueString);
                }

                Log.e("===End===", "===End===");

                parseJson(singleObj);
            }
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

}

private boolean isJSONObjectOrString(String str) {
    try {
        new JSONObject(str);
    } catch (JSONException e) {
        //e.printStackTrace(); //If you uncomment, log will confuse you
        return false;//If string
    }
    return true;//If JSONObject
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2019-09-15
    • 2019-11-23
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多