繁体   English   中英

Spring Boot 嵌套动态 json 请求映射到 pojo

[英]Spring Boot nested dynamic json request mapping to pojo

我正在构建一个 REST API,它接受来自用户的以下 JSON 格式的输入。 具体是嵌套的 JSON 对象,其键值是动态的,其关联的数据类型也是动态的 就像下面的颜色是一个字符串列表,ram 是一个整数列表,值也可以是字符串、布尔值和整数类型。 如何构建请求 POJO 类以将请求 JSON 转换为请求对象,考虑到细节在键、值及其数据类型方面是动态的。 在下面的 JSON 中,具体可以有 0..n 个键值,其值数据类型可以是字符串列表、整数列表、仅字符串、仅布尔值或仅整数值。 如何将我的请求映射到 Spring Boot 后端中的 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 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 类将请求 JSON 转换为请求对象。 然后,您必须分析Map并根据需要对其进行转换。

我能想到的解决这个问题的唯一可能方法是将specifics属性设为 Map,如下所示:

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;
    }
}

正如您所看到的,处理每一种可能性的逻辑都很丑陋,并且只会随着更多的可能性变得更丑。 不幸的是,周围没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM