[英]How to convert String Json to Json in java
我正在嘗試轉換從Spring Boot應用程序查詢postgres jsonb列得到的String Json結果,
這是我得到的結果看起來像
[
"[\n {\n \"exam\": 50.0,\n \"grade\": \"A\",\n
\"total\": 79.0,\n \"position\": \"First\",\n
\"student_id\": \"89f36efe-1f36-48dc-92bc-c33df2784144\",\n
\"assessment_1\": 9.0,\n \"assessment_2\": 17.0,\n
\"assessment_3\": 5.0,\n \"student_name\": \"Anana
Aristotle\"\n },\n {\n \"exam\": 50.0,\n
\"grade\": \"A\",\n \"total\": 79.0,\n
\"position\": \"First\",\n \"student_id\": \"89f36efe-
1f36-48dc-92bc-c33df2784144\",\n \"assessment_1\":
9.0,\n \"assessment_2\": 17.0,\n
\"assessment_3\": 5.0,\n \"student_name\": \"Anana
Aristotle\"\n },\n {\n \"exam\": 50.0,\n
\"grade\": \"A\",\n \"total\": 79.0,\n
\"position\": \"First\",\n \"student_id\": \"89f36efe-
1f36-48dc-92bc-c33df2784144\",\n \"assessment_1\":
9.0,\n \"assessment_2\": 17.0,\n
\"assessment_3\": 5.0,\n \"student_name\": \"Anana
Aristotle\"\n },\n {\n \"exam\": 50.0,\n
\"grade\": \"A\",\n \"total\": 79.0,\n
\"position\": \"First\",\n \"student_id\": \"89f36efe-
1f36-48dc-92bc-c33df2784144\",\n \"assessment_1\": 9.0,\n
\"assessment_2\": 17.0,\n \"assessment_3\": 5.0,\n
\"student_name\": \"Anana Aristotle\"\n }\n]"
]
在返回結果之前,我已經嘗試在服務中執行此操作,但仍然可以獲得預期的結果:
public List<?> getStudentAssessments(){
List<?> assessments =
assessmentRepository.getStudentAssessments();
Gson gson = new Gson();
return Collections.singletonList(gson.toJson(assessments));
}
這是我正在使用的代碼:
我的資料庫
@Query(value = "select jsonb_pretty(a.assessment) from assessment a
where subject_id = 8", nativeQuery = true)
List<?> findAssessmentsByGrade();
我的服務
public List<?> getStudentAssessments(){
return assessmentRepository.getStudentAssessments();
}
還有我的控制器
@ResponseBody
@GetMapping("")
public List<?> getForms(){
return assessmentService.getStudentAssessments();
}
這是我的預期結果:
[
{"exam": 50.0, "grade": "A", "total": 79.0, "position": "First",
"student_id": "89f36efe-1f36-48dc-92bc-c33df2784144"},
{"exam": 50.0, "grade": "A", "total": 79.0, "position": "First",
"student_id": "89f36efe-1f36-48dc-92bc-c33df2784144"},
]
沒有換行符。
您在Java字符串中具有以[
開頭的JSON文本,並且具有字符串文字:
[ "..." ]
因此,將其作為JSON解析為String[]
或List<String>
。
在這種情況下,數組中有1個值,因此獲取它。 該字符串值是另一個JSON文本:
[
{
"exam": 50.0,
"grade": "A",
"total": 79.0,
"position": "First",
"student_id": "89f36efe-1f36-48dc-92bc-c33df2784144",
"assessment_1": 9.0,
"assessment_2": 17.0,
"assessment_3": 5.0,
"student_name": "Anana Aristotle"
},
{
"exam": 50.0,
"grade": "A",
"total": 79.0,
"position": "First",
"student_id": "89f36efe-1f36-48dc-92bc-c33df2784144",
"assessment_1":9.0,
"assessment_2": 17.0,
"assessment_3": 5.0,
"student_name": "Anana Aristotle"
},
{
"exam": 50.0,
"grade": "A",
"total": 79.0,
"position": "First",
"student_id": "89f36efe-1f36-48dc-92bc-c33df2784144",
"assessment_1":9.0,
"assessment_2": 17.0,
"assessment_3": 5.0,
"student_name": "Anana Aristotle"
},
{
"exam": 50.0,
"grade": "A",
"total": 79.0,
"position": "First",
"student_id": "89f36efe-1f36-48dc-92bc-c33df2784144",
"assessment_1": 9.0,
"assessment_2": 17.0,
"assessment_3": 5.0,
"student_name": "Anana Aristotle"
}
]
假設您有一個與這些對象匹配的StudentAssessment
類,請將其解析為StudentAssessment[]
或List<StudentAssessment>
。
簡而言之,您需要兩次調用JSON解析器 。
我的建議是為此使用Jackson。
這是我的處理方式:
1)創建您的數據傳輸對象
public class AssessmentDto {
private Double exam;
private String grade;
private Double total;
private String position;
@JsonProperty("student_id")
private UUID studentId;
// Getter & Setters omitted for brevity
}
2)編寫反序列化邏輯
private final ObjectMapper mapper = new ObjectMapper();
public List<?> getStudentAssessments(){
List<?> assessments =
assessmentRepository.getStudentAssessments();
return assessments.stream()
.map(a -> readAssessment(a))
.collect(Collectors.toList());
}
private Object readAssessment(Object a) {
try {
return mapper.readValue(a.toString(), new TypeReference<List<AssessmentDto>>() {});
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.