当前位置: 首页 > 知识库问答 >
问题:

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

吕霖
2023-03-14

我正在构建一个RESTAPI,它接受用户以以下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;
  }

共有2个答案

柯良骏
2023-03-14

您可以使用映射,而不是使用POJO类将请求JSON转换为请求对象。然后你必须分析地图

何志业
2023-03-14

我能想到的唯一可能的解决方法是将属性映射如下:

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

正如你所看到的那样,处理每一种可能性的逻辑是丑陋的,并且只会随着其他可能性而变得更丑陋。不幸的是,它周围没有。

 类似资料:
  • 问题内容: 我正在尝试为如下对象创建动态映射: 我希望属性为嵌套类型,该类型是我在下面的映射中使用nested_feature模板定义的,并且按预期工作。但是,我也想让属性的嵌套对象中的每个属性都带有定义的其他属性。我尝试了第二个nested_template模板,但没有成功。 不幸的是,属性中的属性是从另一个进程创建的,几乎可以是任何名称/值对。关于如何使用动态模板将属性设置为嵌套的任何建议,以

  • 我试图为对象创建一个动态映射,如下所示:

  • 我有一个requestbody作为, 我无法使用spring将此映射到请求映射。我试过用下面的,但没有用。 公共类请求映射{ } 如何映射请求正文? 编辑Json中的大小写敏感键。

  • 我必须做一个用户/权限表,其中“权限”是X轴,“用户”是Y轴。表的其余部分由复选框填充,这些复选框指示X用户是否具有Y权限。这两个都是动态长度,每个API都可以访问另一个API。即:权限API为每个权限,具有该权限的用户数组。此外,用户API为每个用户,用户拥有的权限数组。 > 我有嵌套贴图的问题,我觉得这样做很昂贵?(如果有40个权限和350个用户,我们将讨论14k复选框) 如何为每个复选框保存

  • 我试图动态解析一些JSON到一个Map 但是当我尝试使用一些更复杂的JSON和嵌套信息时失败了。我试图从json解析示例数据。组织 我得到以下错误 异常在线程"main"com.fasterxml.jackson.databind.JsonMapping异常:不能反序列化实例的java.lang.字符串START_OBJECT令牌 有没有办法将复杂的JSON数据解析成映射?

  • 有没有什么方法可以将嵌套的JSON值映射到字段而不需要额外的类?我有一个JSON响应 但是在中,我只需要值。因此,我决定创建Kotlin数据类,并尝试使用注释的选项 下面的代码正在工作 我有几个嵌套值,为它们创建额外的类是相当夸张的。还有比为节点创建嵌套类更好的方法吗?