java - 具有不同名称的Spring json map元素要列出

标签 java json spring-boot

我使用 spring boot 2.1.4,我的问题是 json 映射到对象。是否可以这样映射json

{
   "name":"test",
   "list1":1,
   "list2":2,
   "list3":3,
   "list4":4,
   "list5":5,
   "list6":6,
   "list7":7
}

这样反对:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Test {

    private String name;
    private List<Integer> list;

}

在我的 spring boot Controller 中它看起来像这样:

@GetMapping("/criteria")
public String registration(@RequestBody Test test) {
    return "";
}

是否可以通过某种方式将此 json 映射到我的自定义对象?

最佳答案

您可以为对象创建自定义反序列化器,如下所示。

@JsonDeserialize(using = CustomDeserializer::class)
data class MyCustomObject(
    var name: String,
    var list: List<Int>
)

class CustomDeserializer: JsonDeserializer<MyCustomObject>(){
    override fun deserialize(p: JsonParser, ctxt: DeserializationContext): MyCustomObject {
        var myList = ArrayList<Int>()
        var myName = ""
        while(p.nextToken() != JsonToken.END_OBJECT){
            if(p.currentName() == "name"){
                myName = p.nextTextValue()
            }
            if(p.currentName().contains("list")){
                myList.add(p.nextIntValue(0))
            }
        }

        return MyCustomObject(myName, myList)
    }
}

这是用 Kotlin 编写的,如果您需要我帮助将其转换为 Java,请告诉我。

编辑 继续为您将其转换为 Java。请原谅任何打字错误:) 如果您有任何疑问或问题,请告诉我

@JsonDeserialize(using = CustomDeserializer.class)
public class MyCustomObjectAgain {
    private String name;
    private List<Integer> myList;

    public MyCustomObjectAgain(String name, List<Integer> myList) {
        this.name = name;
        this.myList = myList;
    }

    private class CustomDeserializer extends JsonDeserializer<MyCustomObject>{
        @Override
        public MyCustomObject deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            List<Integer> myList = new ArrayList();
            String myName = "";
            while(p.nextToken() != JsonToken.END_OBJECT){
                if(p.currentName() == "name"){
                    myName = p.nextTextValue();
                }
                if(p.currentName().contains("list")){
                    myList.add(p.nextIntValue(0));
                }
            }

            return new MyCustomObject(myName, myList);
        }
    }
}

关于java - 具有不同名称的Spring json map元素要列出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56011446/

相关文章:

java - 是否可以在64位java/linux环境中运行8GB堆大小的Weblogic

java - Gradle 同步失败。构建失败,出现异常。 build.gradle 内容异常? IDE fatal error

json - 如何在 jq 中为 CSV 导出添加标题?

javascript - 将 JSON 数据与 jQuery highcharts 插件结合使用

java - 将 spring 配置文件添加到 SpringBootTest 中的现有配置文件中

java - 如果 WebAppContext 无法启动,如何取消启动或关闭 jetty

iOS Swift Json 序列化中断字符串返回

spring-boot - 我应该在 Spring Boot RestController 中使用 bool 值还是 bool 值?

java - 为 Spring Boot 应用程序构建了两个 JAR

java - 为什么我们要在 Spring Boot 中更改 servlet 上下文路径?