# فناوری جاوا > برنامه‌نویسی جاوا >  خواندن و پارس کردن فایل JSON تو در تو

## Raminab

سلام دوستان
من ی فایل JSON دارم به شکل زیر 


{
	"student1":
	{
		"element":
				[
					{"id":"092","level":"high"},
					{"id":"093","level":"high"}
				],
				"type":"normal"
	},
	"strudent2":
	{
		"element":
				[
					{"id":"094","level":"med"},
					{"id":"095","level":"med"},
					{"id":"096","level":"high"}
				],
				"type":"normal"
	}
}



میخوام اینو پارس کنم . اول میام کل فایل رو به صورت string میخونم و بعدش تبدیلش میکنم به یه JSONObject
الآن میخوام روی تک تک student ها پردازش کنم ولی نمیدونم به چه طریقی تک تکشون رو بخونم
با این کد 

JSONObject jObj = jObj.getJSONObject("student1");

تونستم student1 رو استخراج کنم ولی میخوام کارم داینامیک باشه  (تعداد student ها معلوم نیست)
چکار میتونم بکنم که مشکلم حل شه ؟

----------


## ahmad.mo74

سلام، من خیلی از json ای که دادید سر درنیاوردم! رمزی نوشتیدا :)

اما به هر حال به اینصورت میتونید بخونیدش :


public static void main(String[] args) throws IOException, ParseException {
    JSONParser parser = new JSONParser();
    try (FileReader fileReader = new FileReader("filename");
         BufferedReader reader = new BufferedReader(fileReader)) {
        JSONObject jsonObject = (JSONObject) parser.parse(reader);
        jsonObject.forEach((k, v) -> {
            System.out.println(k + " : {");
            JSONObject student = (JSONObject) v;
            System.out.println("\ttype : " + student.get("type") + ",");
            JSONArray element = (JSONArray) student.get("element");
            System.out.println("\telement : [");
            for (Object e : element) {
                System.out.println("\t\t{");
                ((JSONObject) e).forEach((a, b) -> System.out.println("\t\t\t" + a + " : " + b + ","));
                System.out.println("\t\t},");
            }
            System.out.println("\t]\n},");
        });
    }
}


اگر یه کلاس Student تعریف میکردید بهتر بود.

----------


## Raminab

ممنون بابت پاسخ 
آره رمزیه  :لبخند گشاده!: 
منظورتون ازین که گفتید کلاس تعریف میکردید چی بود؟ از سمتی که میفرستمش کلاس تعریف کنم و بفرستم ؟ :متفکر:

----------


## ahmad.mo74

یعنی مثلا اگر json تون این شکلی بود :

[ {  "id" : 1,
  "name" : "ahmad",
  "type" : "normal",
  "exams" : [ {
    "courseName" : "A",
    "level" : "mid"
  }, {
    "courseName" : "B",
    "level" : "high"
  } ]
}, {
  "id" : 1,
  "name" : "ehsan",
  "type" : "normal",
  "exams" : [ {
    "courseName" : "A",
    "level" : "mid"
  }, {
    "courseName" : "B",
    "level" : "mid"
  } ]
} ]


براش یه کلاس Student مثل این تعریف کنید :


import java.util.List;

public class Student {


    private long id;
    private String name;
    private String type;
    private List<Exam> exams;


    public Student() {
    }


    public Student(long id, String name, String type, List<Exam> exams) {
        this.id = id;
        this.name = name;
        this.type = type;
        this.exams = exams;
    }


    public long getId() {
        return id;
    }


    public void setId(long id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public String getType() {
        return type;
    }


    public void setType(String type) {
        this.type = type;
    }


    public List<Exam> getExams() {
        return exams;
    }


    public void setExams(List<Exam> exams) {
        this.exams = exams;
    }


    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", exams=" + exams +
                '}';
    }


}


Exam.java :

public class Exam {

    private String courseName;
    private String level;


    public Exam() {
    }


    public Exam(String courseName, String level) {
        this.courseName = courseName;
        this.level = level;
    }


    public String getCourseName() {
        return courseName;
    }


    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }


    public String getLevel() {
        return level;
    }


    public void setLevel(String level) {
        this.level = level;
    }


    @Override
    public String toString() {
        return "Exam{" +
                "courseName='" + courseName + '\'' +
                ", level='" + level + '\'' +
                '}';
    }


}


حالا خیلی راحت تر و تمیز تر میتونید لیست Student هارو داشته باشید :

import org.json.simple.JSONArray;import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class Main {


    public static void main(String[] args) throws IOException, ParseException {
        List<Student> students = new ArrayList<>();
        try (FileReader fileReader = new FileReader("filename");
             BufferedReader reader = new BufferedReader(fileReader)) {
            JSONArray jsonArray = (JSONArray) new JSONParser().parse(reader);
            for (Object o : jsonArray) {
                JSONObject jsonObject = (JSONObject) o;
                students.add(getStudent(jsonObject));
            }
        }
        for (Student student : students) {
            System.out.println("student id = " + student.getId());
            System.out.println("student name = " + student.getName());
            System.out.println("student type = " + student.getType());
            for (Exam exam : student.getExams()) {
                System.out.println("exam course name = " + exam.getCourseName());
                System.out.println("exam level = " + exam.getLevel());
            }
            System.out.println("----------");
        }
    }


    static Student getStudent(JSONObject jsonObject) {
        List<Exam> exams = new ArrayList<>();
        JSONArray jsonArray = (JSONArray) jsonObject.get("exams");
        for (Object o : jsonArray) {
            JSONObject exam = (JSONObject) o;
            String courseName = String.valueOf(exam.get("courseName"));
            String level = String.valueOf(exam.get("level"));
            exams.add(new Exam(courseName, level));
        }
        long id = Long.parseLong(String.valueOf(jsonObject.get("id")  ));
        String name = String.valueOf(jsonObject.get("name"));
        String type = String.valueOf(jsonObject.get("type"));
        return new Student(id, name, type, exams);
    }


}


شما هم میتونید براساس فرمت json تون (من چیزی ازش نفهمیدم) برای Student کلاسش رو تعریف کنید و به همین شکل json رو بخونید.

----------

