Daily Record

This is a non-commercial site, is a record of the life of a technology site

SEARCH


Spring Boot中处理JSON响应

当在Spring Boot中处理JSON响应时,你可以根据是否有实体类(DTOs)来解析JSON字符串。
同时,如果你想要将JSON字符串转换为 JSONObject,你可以选择使用不同的库,如 org.jsoncom.alibaba.fastjsoncom.google.gson.JsonObject。下面我将为你提供具体的示例。

使用实体类(DTOs)

如果有一个与JSON结构相匹配的实体类(DTO),那么可以直接使用它来映射JSON。

步骤

  1. 定义DTO类
public class MyResponseDTO {
      private String key1;
      private int key2;
      // getters and setters...  }
  1. 发送HTTP请求并接收DTO
@Service
  public class MyService {
      @Autowired
      private RestTemplate restTemplate;
      public MyResponseDTO callApiAndGetDto() {
          String url = "http://example.com/api/endpoint";
          return restTemplate.getForObject(url, MyResponseDTO.class);
      }
  }
  @RestController
  public class MyController {
      @Autowired
      private MyService myService;
      @GetMapping("/get-data-with-dto")
      public ResponseEntity<String> getDataWithDto() {
          MyResponseDTO response = myService.callApiAndGetDto();
          return ResponseEntity.ok("Key1: " + response.getKey1() + ", Key2: " + response.getKey2());      }  }

不使用实体类,直接操作JSON字符串

如果没有实体类,可以直接接收JSON字符串并解析。

步骤

  1. 发送HTTP请求并接收JSON字符串
@Service
  public class MyService {
      @Autowired
      private RestTemplate restTemplate;
      public String callApiAndGetRawJson() {
          String url = "http://example.com/api/endpoint";
          return restTemplate.getForObject(url, String.class);
      }
  }
  1. 解析JSON字符串为JSONObject(使用 org.json):
import org.json.JSONObject;
  @RestController
  public class MyController {
      @Autowired
      private MyService myService;
      @GetMapping("/get-data-without-dto-org-json")
      public ResponseEntity<String> getDataWithoutDtoOrgJson() throws Exception {
          String json = myService.callApiAndGetRawJson();
          JSONObject jsonObject = new JSONObject(json);
          String key1 = jsonObject.getString("key1");
          int key2 = jsonObject.getInt("key2");
          return ResponseEntity.ok("Key1: " + key1 + ", Key2: " + key2);
      }
  }

引用不同包的JSONObject类(使用 com.alibaba.fastjson

在Spring Boot中,虽然直接使用 JSONObject类(如org.json库或net.sf.json库中的)不是最推荐的方式(因为Spring Boot通常与Jackson或Gson等库集成得更好),但有时你可能仍然需要用到这些库来处理JSON字符串。以下是使用不同包中的 JSONObject类来转换JSON字符串的示例和讲解。

使用org.json库

首先,你需要在你的 pom.xml中添加org.json库的依赖(如果你使用的是Maven):

<dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20210307</version>
    <!-- 使用你需要的最新版本 -->
  </dependency>

转换Java对象到JSON字符串

通常,你不会直接用 JSONObject来转换一个完整的Java对象到JSON字符串,但你可以创建一个 JSONObject并手动添加字段。不过,为了演示,我们假设你有一个简单的 Person类,并手动构建 JSONObject

import org.json.JSONObject;
  public class Main {
      public static void main(String[] args) {
          Person person = new Person("Alice", 30);          // 手动构建 JSONObject
          JSONObject jsonObject = new JSONObject();
          jsonObject.put("name", person.getName());
          jsonObject.put("age", person.getAge());
          String jsonString = jsonObject.toString();
          System.out.println(jsonString); // 输出: {"name":"Alice","age":30}
      }
  }
 

转换JSON字符串到Java对象

使用 JSONObject将JSON字符串转换回Java对象通常意味着你需要手动从 JSONObject中提取字段并设置到Java对象中。

import org.json.JSONObject;
  public class Main {
      public static void main(String[] args) {
          String jsonString = "{\"name\":\"Alice\",\"age\":30}";          // 从 JSON 字符串创建 JSONObject
          JSONObject jsonObject = new JSONObject(jsonString);          // 手动创建并设置 Person 对象
          Person person = new Person();
          person.setName(jsonObject.getString("name"));
          person.setAge(jsonObject.getInt("age"));          // 输出 Person 对象的信息
          System.out.println("Name: " + person.getName()); // 输出: Name: Alice
          System.out.println("Age: " + person.getAge());   // 输出: Age: 30
      }
  }  

使用net.sf.json库

虽然net.sf.json库已经有些年头了,并且可能不是最新的选择,但这里也提供一个基本的示例。

首先,添加net.sf.json库的依赖(如果你使用的是Maven):

<dependency>
      <groupId>net.sf.json-lib</groupId>
      <artifactId>json-lib</artifactId>
      <version>2.4</version>
 <!-- 使用你需要的最新版本 -->
      <classifier>jdk15</classifier>
  </dependency>

注意:classifier标签可能根据你的JDK版本有所不同。

转换Java对象到JSON字符串

与org.json类似,你通常不会直接用 JSONObject来转换整个Java对象,但你可以手动构建它。

import net.sf.json.JSONObject;
  public class Main {
      public static void main(String[] args) {
          Person person = new Person("Alice", 30);          // 手动构建 JSONObject
          JSONObject jsonObject = new JSONObject();
          jsonObject.put("name", person.getName());
          jsonObject.put("age", person.getAge());
          String jsonString = jsonObject.toString();
          System.out.println(jsonString); // 输出: {"name":"Alice","age":30}
      } 
 } 

转换JSON字符串到Java对象

同样,你需要手动从 JSONObject中提取字段并设置到Java对象中。

import net.sf.json.JSONObject;
  public class Main {
      public static void main(String[] args) {
          String jsonString = "{\"name\":\"Alice\",\"age\":30}";          // 从 JSON 字符串创建 JSONObject
          JSONObject jsonObject = JSONObject.fromObject(jsonString);          // 手动创建并设置 Person 对象
          Person person = new Person();
          person.setName((String) jsonObject.get("name"));
          person.setAge(((Number) jsonObject.get("age")).intValue());          // 输出 Person 对象的信息
          System.out.println("Name: " + person.getName()); // 输出: Name: Alice
          System.out.println("Age: " + person.getAge());   // 输出: Age: 30
      }
  } 

讲解

虽然这些库提供了直接操作JSON字符串的能力,但在Spring Boot项目中,通常推荐使用Jackson或Gson这样的库,因为它们与Spring框架集成得更好,提供了更多的功能和更好的性能。此外,这些库还支持注解和配置,使得JSON序列化和反序列化过程更加灵活和可定制。

如果你确实需要使用 JSONObject来处理JSON字符串(例如,在与不支持Java对象的外部系统交互时),那么上述示例提供了基本的使用方法。但是,请注意,这些库通常不用于处理复杂的Java对象图,而是用于处理简单的JSON数据结构。

最近的文章

在Vue.js的开发过程中,理解其生命周期是非常重要的。Vue实例从创建到销毁的过程,就是其生命周期。在这个过程中,Vue.js提供了多个钩子函数,允许我们在不同的阶段执行特定的代码。本文将详细解析Vue.js的生命周期,并通过代码实践来加深理解。 一、Vue.js 生命周期概述 Vue.js的生命…

继续阅读
更早的文章

在Java开发中,我们经常需要将JSON格式的字符串转换为Java对象,特别是当这些对象以列表的形式存在时。为了完成这一任务,我们通常会使用一些流行的JSON处理库,如Jackson、Gson和Fastjson。下面我们将详细介绍如何使用这些库来实现JSON字符串到实体类列表的转换。 1. 使用Ja…

继续阅读