Spring 引导嵌套动态 json 请求映射到 pojo
Spring Boot nested dynamic json request mapping to pojo
我正在构建一个 REST API,它接受来自用户的以下 JSON 格式的输入。 细节 是嵌套的JSON 对象,其键值是动态的,其关联的数据类型也是动态的。就像下面的颜色是一个字符串列表,ram 是一个整数列表,值也可以是字符串、布尔和整数类型。如何构建 Request POJO class 以将 Request JSON 转换为 Request Object 考虑细节在键、值及其数据类型方面是动态的。在下面的JSON中,specifics可以有0..n个key-value,它的value数据类型可以是List of String, List of Integer, String only, boolean only, 或者Just Integer value。如何将我的请求映射到 spring 引导后端中的 POJO。
{
name : {
subtitle : "iPhone xr",
title: "The new iphone"
},
specifics: {
"color" : ["red","blue","green"],
"ram" : [ 32 , 64 ],
"length": 7,
"model" : 10 ,
"hasLight" : true
},
description: {
short: " This is short description",
long: " This is long description ",
language: "en"
}
}
Class
class Item{
private Title title;
private Specifics specifics; //How to make this dynamic and key-value with distinct data type
private Description description;
}
public class Title {
private String subtitle;
private String title;
}
public class Description {
private String shortDes;
private String longDes;
private String language;
}
您可以使用 Map
,而不是使用 POJO class 将请求 JSON 转换为请求对象。然后你必须分析 Map<String, Object>
并根据需要转换值 (Object
)。
我能想到的唯一可能的处理方法是制作 specifics
属性 地图,如下所示:
class Item {
private Title title;
private Map<String, Object> specifics;
private Description description;
}
现在丑陋的部分是当你需要(如果你真的需要)处理数据。考虑以下示例:
public static void main(String[] args) {
Map<String, Object> specifics = new HashMap<>();
specifics.put("color", List.of("red","blue","green"));
specifics.put("ram", List.of(32 , 64));
specifics.put("length", 7);
specifics.put("model", 10);
specifics.put("hasLight", true);
Item item = new Item(specifics);
for (Object object : item.getSpecifics().values()) {
if (object instanceof List) {
System.out.println("::::: List :::::");
for (Object listObject : (List) object) {
if (String.class.isAssignableFrom(listObject.getClass())) {
System.out.println("String: " + object);
}
if (Number.class.isAssignableFrom(listObject.getClass())) {
System.out.println("Number: " + object);
}
}
}
if (object instanceof Number) {
System.out.println("Number: " + object);
}
if (object instanceof Boolean) {
System.out.println("Boolean: " + object);
}
}
}
public static class Item {
private Map<String, Object> specifics;
public Item(Map<String, Object> specifics) {
this.specifics = specifics;
}
public Map<String, Object> getSpecifics() {
return specifics;
}
}
如您所见,处理每一种可能性的逻辑是丑陋的,并且只会随着更多的可能性变得更加丑陋。可惜周围没有。
我正在构建一个 REST API,它接受来自用户的以下 JSON 格式的输入。 细节 是嵌套的JSON 对象,其键值是动态的,其关联的数据类型也是动态的。就像下面的颜色是一个字符串列表,ram 是一个整数列表,值也可以是字符串、布尔和整数类型。如何构建 Request POJO class 以将 Request JSON 转换为 Request Object 考虑细节在键、值及其数据类型方面是动态的。在下面的JSON中,specifics可以有0..n个key-value,它的value数据类型可以是List of String, List of Integer, String only, boolean only, 或者Just Integer value。如何将我的请求映射到 spring 引导后端中的 POJO。
{
name : {
subtitle : "iPhone xr",
title: "The new iphone"
},
specifics: {
"color" : ["red","blue","green"],
"ram" : [ 32 , 64 ],
"length": 7,
"model" : 10 ,
"hasLight" : true
},
description: {
short: " This is short description",
long: " This is long description ",
language: "en"
}
}
Class
class Item{
private Title title;
private Specifics specifics; //How to make this dynamic and key-value with distinct data type
private Description description;
}
public class Title {
private String subtitle;
private String title;
}
public class Description {
private String shortDes;
private String longDes;
private String language;
}
您可以使用 Map
,而不是使用 POJO class 将请求 JSON 转换为请求对象。然后你必须分析 Map<String, Object>
并根据需要转换值 (Object
)。
我能想到的唯一可能的处理方法是制作 specifics
属性 地图,如下所示:
class Item {
private Title title;
private Map<String, Object> specifics;
private Description description;
}
现在丑陋的部分是当你需要(如果你真的需要)处理数据。考虑以下示例:
public static void main(String[] args) {
Map<String, Object> specifics = new HashMap<>();
specifics.put("color", List.of("red","blue","green"));
specifics.put("ram", List.of(32 , 64));
specifics.put("length", 7);
specifics.put("model", 10);
specifics.put("hasLight", true);
Item item = new Item(specifics);
for (Object object : item.getSpecifics().values()) {
if (object instanceof List) {
System.out.println("::::: List :::::");
for (Object listObject : (List) object) {
if (String.class.isAssignableFrom(listObject.getClass())) {
System.out.println("String: " + object);
}
if (Number.class.isAssignableFrom(listObject.getClass())) {
System.out.println("Number: " + object);
}
}
}
if (object instanceof Number) {
System.out.println("Number: " + object);
}
if (object instanceof Boolean) {
System.out.println("Boolean: " + object);
}
}
}
public static class Item {
private Map<String, Object> specifics;
public Item(Map<String, Object> specifics) {
this.specifics = specifics;
}
public Map<String, Object> getSpecifics() {
return specifics;
}
}
如您所见,处理每一种可能性的逻辑是丑陋的,并且只会随着更多的可能性变得更加丑陋。可惜周围没有。