我有这个json对象:
public static final String JSON_TEXT = "{" +
"\"Subjects\": [{" +
"\"primaryKey\": \"1\"," +
"\"subjectName\": \"English\"" +
"}," +
"{" +
"\"primaryKey\": \"2\"," +
"\"subjectName\": \"Spanish\"" +
"}" +
"]," +
"\"Exams\": [{" +
"\"primaryKey\": \"1\"," +
"\"grade\": \"10\"" +
"}," +
"{" +
"\"primaryKey\": \"2\"," +
"\"grade\": \"20\"" +
"}" +
"]" +
"}";
并且需要为json dao实现构建一些方法。
我已经建成了
public Collection<Subject> getSubjects()
成功但我完全陷入困境
public Subject findSubjectById(Integer subjectId)
这是我到目前为止的第一个想法:
public Subject findSubjectById(Integer subjectId) {
JSONObject obj = (JSONObject)JSON_PARSER.parse(JSON_TEXT);
if (obj.get(subjectId) != null)
try {
JSONArray subjectsArray = (JSONArray) obj.get("Subjects");
for (int i = 0; i < subjectsArray.length(); i++){
}
} catch (ParseException e) {
e.printStackTrace();
}
return subject;
}
任何想法/例子都非常感谢您解决这个问题。提前致谢!
在for循环中尝试这个
JSONObject subDtl=subjectsArray.getJSONObject(i);
int subKey=subDtl.getInt("primaryKey");
String subName=subDtl.getString("subjectName");
我知道你不使用Gson但它会解决你所有的问题。另外,我建议将字段名称更改为“主题”和“考试”而不是“主题”和“考试”。
这是完整的解决方案,至少值得考虑。
public class Data {
private List<Subject> subjects;
private List<Exam> exams;
public Data(String json) {
Data data = new Gson().fromJson(json, Data.class);
this.subjects = data.subjects;
this.exams = data.exams;
Reporter.log(new Gson().toJson(this), true);
}
public Subject findSubjectById(Integer id) {
return subjects.stream().filter(subject -> subject.primaryKey.equals(id)).findAny().orElse(null);
}
public Exam findExamById(Integer id) {
return exams.stream().filter(exam -> exam.primaryKey.equals(id)).findAny().orElse(null);
}
public List<Subject> getSubjects() {
return subjects;
}
public void setSubjects(List<Subject> subjects) {
this.subjects = subjects;
}
public List<Exam> getExams() {
return exams;
}
public void setExams(List<Exam> exams) {
this.exams = exams;
}
public class Subject {
private Integer primaryKey;
private String subjectName;
public Integer getPrimaryKey() {
return primaryKey;
}
public void setPrimaryKey(Integer primaryKey) {
this.primaryKey = primaryKey;
}
public String getSubjectName() {
return subjectName;
}
public void setSubjectName(String subjectName) {
this.subjectName = subjectName;
}
}
public class Exam {
private Integer primaryKey;
private String grade;
public Integer getPrimaryKey() {
return primaryKey;
}
public void setPrimaryKey(Integer primaryKey) {
this.primaryKey = primaryKey;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
}
}
以下是验证我们解决方案的测试
@SpringBootTest(classes = TestNGWithSpringApplication.class)
public class JsonDataIT extends AbstractTestNGSpringContextTests {
String json = "{ \n"
+ " \"subjects\":[ \n"
+ " { \n"
+ " \"primaryKey\":\"1\",\n"
+ " \"subjectName\":\"English\"\n"
+ " },\n"
+ " { \n"
+ " \"primaryKey\":\"2\",\n"
+ " \"subjectName\":\"Spanish\"\n"
+ " }\n"
+ " ],\n"
+ " \"exams\":[ \n"
+ " { \n"
+ " \"primaryKey\":\"1\",\n"
+ " \"grade\":\"10\"\n"
+ " },\n"
+ " { \n"
+ " \"primaryKey\":\"2\",\n"
+ " \"grade\":\"20\"\n"
+ " }\n"
+ " ]\n"
+ "}";
@Test
public void findSubjectTest() {
Data.Subject subject = new Data(json).findSubjectById(new Integer(2));
Assert.assertEquals(subject.getSubjectName(), "Spanish");
}
@Test
public void findExamTest() {
Data.Exam exam = new Data(json).findExamById(new Integer(2));
Assert.assertEquals(exam.getGrade(), "20");
}
}
这应该工作