簡體   English   中英

如何在Java中將String Json轉換為Json

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM