2

如何将这个带有动​​态属性的 JSON 字符串映射到 Java 对象?

{    
    'name' : 'John',
    'lastname': 'Doe',
    'dynamicProperty1': { 'label' : 'size', 'value': 'large'},
    'dynamicProperty2': { 'label' : 'color', 'value': 'blue'},
    'dynamicProperty3': { 'label' : 'height', 'value': 200},
    'dynamicProperty...': { 'label' : 'points', 'value': 300}
}
4

2 回答 2

2

您可以使用JsonAnySetter注释:

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

public class HandleDynamicKeysInJsonApp {

    public static void main(String[] args) throws IOException {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();

        Person person = mapper.readValue(jsonFile, Person.class);
        System.out.println(person);
    }
}

@Data
class Person {
    private String name;

    @JsonProperty("lastname")
    private String lastName;

    private Map<String, Label> labels = new LinkedHashMap<>();

    @JsonAnySetter
    public void addDynamicProperties(String key, Label label) {
        labels.put(key, label);
    }
}

@Data
class Label {
    private String label;
    private Object value;
}
于 2020-12-09T12:48:10.603 回答
0

您可以实现一个 Java 类来保存 name、lastName 和 hashmap 来存储动态属性。例子 -

public class Person {
   String name;
   String lastName;
   Map<String,Object> dynamicProperty1;
   Map<String,Object> dynamicProperty2;
   Map<String,Object> dynamicProperty3;
}

或者,如果您有可变数量的动态属性映射(如评论中所建议的那样),您可以执行以下操作

public class Person {
   String name;
   String lastName;
   Map<String,Map<String, Object>> dynamicPropertyMaps;
 }

然后在您的映射器类中,您可以根据 JSON 中的值创建哈希映射并将它们放入 dynamicPropertyMaps 映射中。

于 2020-12-09T06:11:05.883 回答