【问题标题】:Android parse json treeAndroid解析json树
【发布时间】:2014-03-18 01:17:57
【问题描述】:

我有树 JSON 结构的数据。 类似的东西

{
"result": [
    {
        "id": 1,
        "name": "test1"
    },
    {
        "id": 2,
        "name": "test12",
        "children": [
            {
                "id": 3,
                "name": "test123",
                "children": [
                    {
                        "id": 4,
                        "name": "test123"
                    }
                ]
            }
        ]
    }
]

}

型号:

class DataEntity {
    int id;
    String name;
    List<DataEntity> childDataEntity;
}

通过 org.json 解析

    List<DataEntity> categories = new ArrayList<DataEntity>();

private List<DataEntity> recursivellyParse(DataEntity entity, JSONObject object) throws JSONException {
    entity.setId(object.getInt("id"));
    entity.setName(object.getString("name"));
    if (object.has("children")) {
        JSONArray children = object.getJSONArray("children");
        for (int i = 0; i < children.length(); i++) {
            entity.setChildDataEntity(recursivellyParse(new DataEntity(), children.getJSONObject(i)));
            categories.add(entity);
        }
    }
    return categories;
}

打电话

  JSONObject jsonObject = new JSONObject(JSON);
        JSONArray jsonArray = jsonObject.getJSONArray("result");
        for (int i = 0; i < jsonArray.length(); i++) {
            recursivellyParse(new DataEntity(), jsonArray.getJSONObject(i));
        }

但是这种方式是错误的。 List方法执行后填写相同的数据。

如何正确解析?

UPD:更新 JSON。

【问题讨论】:

  • 您的回复无效,请查看jsonlint.com
  • @YuriyAizenberg:我面临同样的问题..我没有得到下面写的解决方案..你能告诉我你做了什么改变让它工作吗?

标签: android json recursion tree


【解决方案1】:

忽略您显示的 JSON 无效(我将假设这是复制/粘贴问题或错字),问题是您已将 categories List 声明为任何对象的成员。

每次调用recursivellyParse() 时都会不断添加该数据,并且该数据仍保留在列表中。循环中的每个后续调用都会看到之前的调用。

在编写代码时,一个简单的解决方案是简单地添加第二个版本来清除列表:

private List<DataEntity> beginRecursivellyParse(DataEntity entity, 
                                      JSONObject object) throws JSONException {

    categories.clear();
    return recursivellyParse(entity, object);
}

然后从你的循环中调用它。

【讨论】:

  • 是的,我了解递归调用中的问题。但是不太明白怎么做才对。你能告诉我正确的版本吗?
  • @YuriyAizenberg 查看编辑;这是解决它的一种方法
  • @YuriyAizenberg 和 Brian Roach:我已经尝试过您的答案,但是在 ArrayList 中存储数据时出现错误。你能给我解决我的问题吗?我已将我的代码放在下面的链接中:app.box.com/s/9ca7bhp04y078wduumoj7j0wkaa4rw40Thankx 提前
【解决方案2】:

这里是完整的演示如何根据需要解析 json 数据。

String JSON = "your json string";
  ArrayList<DataEntity> finalResult = new ArrayList<>();


  try {
                JSONObject main = new JSONObject(JSON);

                JSONArray result = main.getJSONArray("result");

                for(int i=0;i<result.length();i++){
                    DataEntity dataEntity = parseObject(result.getJSONObject(i));
                    finalResult.add(dataEntity);
                }

                Log.d("DONE","Done Success");

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

创建一个递归函数来解析对象。

public DataEntity parseObject(JSONObject dataEntityObject) throws JSONException {
    DataEntity dataEntity = new DataEntity();
    dataEntity.id = dataEntityObject.getString("id");
    dataEntity.name = dataEntityObject.getString("name");

    if(dataEntityObject.has("children")){
        JSONArray array = dataEntityObject.getJSONArray("children");
        for(int i=0;i<array.length();i++){
            JSONObject jsonObject = array.getJSONObject(i);
            DataEntity temp = parseObject(jsonObject);
            dataEntity.children.add(temp);
        }
    }

    return dataEntity;
}

模型类

public class DataEntity implements Serializable {
public String id = "";
public String name = "";
ArrayList<DataEntity> children = new ArrayList<>();}

在 FinalResult Arraylist 中,您将获得所有解析数据。

【讨论】:

  • 虽然您的答案可能是正确的,但如果您还指出发帖人的代码有什么问题,那就更好了。请注意,接受的答案与这个问题更相关。
猜你喜欢
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 2016-08-04
相关资源
最近更新 更多