【问题标题】:How to convert String Json to Json in java如何在java中将String Json转换为Json
【发布时间】:2020-01-02 00:50:48
【问题描述】:

我正在尝试转换从 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"},
]

没有换行符。

【问题讨论】:

  • 您可以轻松地使用Json框架从Json String到Java对象。

标签: java json spring-boot jpa


【解决方案1】:

我的建议是使用 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;
}

【讨论】:

    【解决方案2】:

    Java 字符串中有 JSON 文本,该字符串以 [ 开头并具有字符串文字:

    [ "..." ]
    

    因此,将其作为 JSON 解析为 String[]List&lt;String&gt;

    在这种情况下,数组中有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&lt;StudentAssessment&gt;

    简而言之,您需要调用 JSON 解析器两次

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2020-08-22
      • 2019-05-31
      • 1970-01-01
      • 2011-02-01
      相关资源
      最近更新 更多