我正在使用 Spring Boot(使用 Java)開發應用程式。此應用程式必須呼叫多個外部服務,并且這些服務中的每一個都需要一個復雜的主體(在 json 或 xml 中)(此輸入可能會有所不同!我傳遞給它的欄位不是必需的,因此有時我什至可能會傳遞這些欄位的子集) . 這些是服務可以接收的輸入示例:
{
"field1": "string",
"field2": "string",
"field3": "string",
"field4": 0,
}
<input>
<input1>my_string</input1>
<input2>my_string</input2>
</input>
我使用 RestTemplate 進行 HTTP 呼叫。這是一個例子。我使用 Java String 對 HTTP 主體進行建模(但它有一個很大的缺陷,即它不可編輯而是硬編碼!):
String Jsonbody = "{\r\n"
" \"field1\": \"" myString1 "\"\r\n"
" \"field2\": \"" myString2 "\"\r\n"
"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> request = new HttpEntity<String>(Jsonbody, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<MyResponseClass> response = restTemplate.postForEntity(url, request, MyResponseClass.class);
在JsonBody變數中像這樣硬編碼主體是非常糟糕的。有什么方法可以讓物件在其中動態插入字串并自動創建一個 JSON 物件(然后我可以將其轉換為字串以放入 .postForEntity 方法)?XML 輸入型別也有同樣的問題。
uj5u.com熱心網友回復:
有多個庫,如Gson或Jackson,實際上允許您使用 JSON,因為它們是 Java 物件,最終將它們序列化為一個主體。
如果你想嘗試一下,你只需要包含Gson作為依賴:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
然后你必須為你的POST身體創建一個 POJO :
public class JsonBody {
private List<String> fields = new LinkedList<>();
void addField(String field) {
fields.add(field);
}
}
并且可以隨意添加任意數量的內容,以便String之后對其進行決議。
JsonBody jsonBody = new JsonBody();
Gson gson = new Gson();
jsonBody.addField(myString1);
jsonBody.addField(myString2);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> request = new HttpEntity<String>(gson.toJson(jsonBody), headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<MyResponseClass> response = restTemplate.postForEntity(url, request, MyResponseClass.class);
這會將您的 JSON 設定為:
{
fields: [
contentMyString1,
contentMyString2
]
}
考慮到前面的示例,您可以根據需要以 POJO 的形式修改和格式化您的 JSON,并使用Gson 中的Gson::toJson(String)函式。
當然,如果您只是將 POJO 創建為:
public class JsonBody {
private String field1;
private String field2;
private String field3;
private Integer field4;
}
那么輸出將與您在初始示例中的輸出相同。
uj5u.com熱心網友回復:
ObjectMapper像這樣使用這個類......
ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car("yellow", "renault");
objectMapper.writeValue(new File("target/car.json"), car);
輸出將是
{"color":"yellow","type":"renault"}
這是有關該主題的更多資料https://www.baeldung.com/jackson-object-mapper-tutorial
同樣的方法用于將物件映射到 XML ( https://www.baeldung.com/jackson-xml-serialization-and-deserialization )
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/345734.html
上一篇:如何針對具有相同架構的兩個資料源配置Springbean
下一篇:無法將屬性系結到“FlywayProperties”,AnnotationConfigApplicationContext@5454d35e尚未重繪
