View Full Version : خواندن و پارس کردن فایل JSON تو در تو
Raminab
شنبه 09 خرداد 1394, 12:09 عصر
سلام دوستان
من ی فایل 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
شنبه 09 خرداد 1394, 13:28 عصر
سلام، من خیلی از 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
شنبه 09 خرداد 1394, 16:10 عصر
ممنون بابت پاسخ
آره رمزیه :لبخند:
منظورتون ازین که گفتید کلاس تعریف میکردید چی بود؟ از سمتی که میفرستمش کلاس تعریف کنم و بفرستم ؟:متفکر:
ahmad.mo74
یک شنبه 10 خرداد 1394, 17:52 عصر
یعنی مثلا اگر 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 رو بخونید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.