หน้าเว็บ

วันอังคารที่ 18 มีนาคม พ.ศ. 2557

walking on JSON tree java

เป็น code ที่ผมเอาไว้อ่านข้อมูลจาก JSON tree ที่มีโครงสร้างข้อมูลเหมือนกัน ครับ


สมมติว่าเรามีข้อมูล json ดังต่อไปนี้
สังเกตว่าทุก node จะมีโครงสร้างข้อมูลเหมือนกัน  คือมี name และ children เหมือนกัน

service.json
{
    "children": [
        {
            "name": "การจัดบริการ",
            "children": [
                { "name": "บริการโรคทั่วไป" }
            ]
        },
        {
            "name": "คลินิกเฉพาะทาง/โรค",
            "children": [
                {
                    "name": "อายุรกรรม",
                    "children": [
                        { "name": "คลินิกโรคหัวใจ" },
                        { "name": "คลินิกโรคไต" },
                        { "name": "คลินิกโรคระบบทางเดินอาหาร" },
                        { "name": "คลินิกโรคระบบการหายใจ / คลินิกโรคทรวงอก" }
                    ]
                }
            ]
        },
        {
            "name" : "บริการเฉพาะ",
            "children" : [
                { "name" : "การบริการโรคเลือดออกง่ายฮีโมฟีเลีย" },
                { "name" : "การบริการบำบัดยาเสพติด" },
                { "name" : "การบริการรังสีรักษา" }
            ]
        }
    ]
}
ใช้ code ที่ผมเขียนไว้  อ่านข้อมูลจาก file service.json ขึ้นมา
String path = this.getClass().getResource("/lookup/service.json").getPath();

new JSONWalker(new File(path)) { //class นี้ผมเขียนขึ้นมา  code อยู่ข้างล่าง

    @Override
    public void walking(JSONWalker.Data data) {
        LOG.debug("id -->  {}", data.getId());
        LOG.debug("name --> {}", data.getName());
        LOG.debug("parent --> {}", data.getParent());
        LOG.debug("");
    }

}.walk();
ผลลัพธ์ที่ได้ จะแสดงผลดังนี้
- id-->  1
- name--> การจัดบริการ
- parent--> null

- id-->  1.1
- name--> บริการโรคทั่วไป
- parent--> 1

- id-->  2
- name--> คลินิกเฉพาะทาง/โรค
- parent--> null

- id-->  2.1
- name--> อายุรกรรม
- parent--> 2

- id-->  2.1.1
- name--> คลินิกโรคหัวใจ
- parent--> 2.1

- id-->  2.1.2
- name--> คลินิกโรคไต
- parent--> 2.1

- id-->  2.1.3
- name--> คลินิกโรคระบบทางเดินอาหาร
- parent--> 2.1

- id-->  2.1.4
- name--> คลินิกโรคระบบการหายใจ / คลินิกโรคทรวงอก
- parent--> 2.1

- id-->  3
- name--> บริการเฉพาะ
- parent--> null

- id-->  3.1
- name--> การบริการโรคเลือดออกง่ายฮีโมฟีเลีย
- parent--> 3

- id-->  3.2
- name--> การบริการบำบัดยาเสพติด
- parent--> 3

- id-->  3.3
- name--> การบริการรังสีรักษา
- parent--> 3

โค๊ดเต็ม

JSONWalker.java
package com.blogspot.na5cecnt.util;

import java.io.File;
import java.util.Objects;
import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *
 * @author redcrow
 */
public abstract class JSONWalker {

    private final File jsonFile;

    public JSONWalker(File jsonFile) {
        this.jsonFile = jsonFile;
    }

    public abstract void walking(Data data);

    public void walk() throws Exception {
        String json = FileUtils.readFileToString(jsonFile, "utf-8");
        walkingTree(new JSONObject(json), "1", null);
    }

    private void walkingTree(JSONObject object, String id, String parentId) throws Exception {
        try {
            String name = object.getString("name");

            boolean hasChildren;
            try {
                object.getJSONArray("children");
                hasChildren = true;
            } catch (JSONException ex) {
                hasChildren = false;
            }

            walking(new Data(id, name, parentId, object, hasChildren));
        } catch (JSONException ex) {
            id = null;
        }

        JSONArray jsonArray;
        try {
            jsonArray = object.getJSONArray("children");
        } catch (JSONException ex) {
            return;
        }

        int length = jsonArray.length();
        for (int i = 1; i < length + 1; i++) {
            JSONObject child = jsonArray.getJSONObject(i - 1);
            walkingTree(child, (id == null) ? (i + "") : (id + "." + i), id);
        }
    }

    public static class Data {

        private final String id;
        private final String name;
        private final String parent;
        private boolean hasChildren = false;

        private final JSONObject object;

        public Data(String id, String name, String parent, JSONObject object, boolean hasChildren) {
            this.id = id;
            this.name = name;
            this.parent = parent;
            this.object = object;
            this.hasChildren = hasChildren;
        }

        public String getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        public String getParent() {
            return parent;
        }

        public JSONObject getObject() {
            return object;
        }

        public boolean hasChildren() {
            return hasChildren;
        }

        @Override
        public int hashCode() {
            int hash = 7;
            hash = 89 * hash + Objects.hashCode(this.id);
            return hash;
        }

        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Data other = (Data) obj;
            if (!Objects.equals(this.id, other.id)) {
                return false;
            }
            return true;
        }

    }
}
dependencies ที่จำเป็นต้องใช้ เมื่อคุณใช้ maven
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20090211</version>
</dependency>

ที่มาของภาพประกอบ : http://www.flash-screen.com/free-wallpaper/100-novel-and-stunning-creative-fantasy-design-wallpaper/tree-man-walking-wallpaper,1366x768,64672.html

ไม่มีความคิดเห็น:

แสดงความคิดเห็น