为了账号安全,请及时绑定邮箱和手机立即绑定

Spring json映射具有不同名称的元素以列出

Spring json映射具有不同名称的元素以列出

慕哥6287543 2022-11-10 16:42:12
我使用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@AllArgsConstructorpublic class Test {    private String name;    private List<Integer> list;}在我的 Spring Boot 控制器中,它看起来像这样:@GetMapping("/criteria")public String registration(@RequestBody Test test) {    return "";}有没有办法将此json映射到我的自定义对象?
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

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


@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);

        }

    }

}


查看完整回答
反对 回复 2022-11-10
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

如果List你可以考虑@JsonAnySetter并且在你需要的程序中做properties.values()


允许我们灵活地使用 Map 作为标准属性。在反序列化时,来自 JSON 的属性将简单地添加到地图中。


@Data

@NoArgsConstructor

@AllArgsConstructor

public class Test {


    private String name;

    private Map<String, String> properties;


    @JsonAnySetter

    public void add(String key, String value) {

       properties.put(key, value);

     }


}

您也可以尝试List使用@JsonAnySetter


@Data

@NoArgsConstructor

@AllArgsConstructor

public class Test {


    private String name;

    private List<Integer> properties;


    @JsonAnySetter

    public void add(String key, Integer value) {

       properties.add(value);

     }


}


查看完整回答
反对 回复 2022-11-10
  • 2 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号