我使用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控制器中,它看起来像这样:
@GetMapping("/criteria")
public String registration(@RequestBody Test test) {
return "";
}
是否可以通过某种方式将此json映射到我的自定义对象?
答案 0 :(得分:2)
您可以为对象创建自定义反序列化器,请参见下文。
@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,请告诉我。
EDIT 接下来,将其转换为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);
}
}
}
答案 1 :(得分:1)
@JsonAnySetter 如果您想使用Map
而不是List
,则可以考虑使用@JsonAnySetter
,并在程序中只需{{1} }
使我们可以灵活地使用Map作为标准属性。反序列化时,JSON的属性将被简单地添加到地图中。
properties.values()
您也可以使用@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