Search code examples
javajsonmappingobjectmapper

Map JSON key-value to class in java


I need to map string JSON by key-value into the POJO class, but I'm not sure there is an easier way to convert this.

My class:

class Colors {
    
    private String name;

    private String color;

    public String getName() { return name; }

    public String getColor() { return color; }

}

Example of JSON:

{
    "white": "FFFFFF",
    "red": "FF0000",
    "black": "000000"
}

Is there any way (instead of using foreach loop) to have the above JSON in List<Colors>?

P.s: I tried some same issue with objectMapper.readValue, but didn't succeed.


Solution

  • You can use com.fasterxml.jackson.annotation.JsonAnySetter annotation which will allow you to handle each key-value pair:

    import com.fasterxml.jackson.annotation.JsonAnySetter;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    
    public class JsonApp {
    
        public static void main(String[] args) throws Exception {
            File jsonFile = new File("./src/main/resources/test.json");
    
            ObjectMapper mapper = new ObjectMapper();
    
            Colors colors = mapper.readValue(jsonFile, Colors.class);
            System.out.println(colors.getColors());
        }
    }
    
    class Colors {
        private final List<Color> colors = new ArrayList<>();
    
        @JsonAnySetter
        public void setAny(String key, String value) {
            colors.add(new Color(key, value));
        }
    
        public List<Color> getColors() {
            return colors;
        }
    }
    
    class Color {
    
        private String name;
        private String color;
    
        public Color(String name, String color) {
            this.name = name;
            this.color = color;
        }
    
        public String getName() {
            return name;
        }
    
        public String getColor() {
            return color;
        }
    
        @Override
        public String toString() {
            return "Color{" +
                    "name='" + name + '\'' +
                    ", color='" + color + '\'' +
                    '}';
        }
    }
    

    Above code prints:

    [Color{name='white', color='FFFFFF'}, Color{name='red', color='FF0000'}, Color{name='black', color='000000'}]
    

    See also: