2017-02-17 8 views
1

Что такое животное способ иметь дело с объектом JSON, который имеет следующую структуру:Java Джексон разобрать динамический объект JSON

{ 
    "Parameters": { 
    "0": { 
     "some key 0": "some value 0" 
    }, 
    "1": { 
     "some key 1": "some value 1" 
    }, 
    "2": { 
     "some key 2": "some value 2" 
    }, 
    .... 
    "n": { 
     "some key n": "some value n" 
    } 
} 

Он содержит свойство от 0 до п (например, 100), каждое свойство является объект с одним ключевым значением. Похоже, все ключи разные.

Можно ли превратить его в список Parameter, где каждый параметр имеет следующую структуру:

public class Parameter { 
    String key; 
    String value; 
} 

Что такое лучший способ справиться с этим в Джексоне?

+0

использование 'ObjectMapper' @RostyslavRoshak –

+0

проверить это: http://stackoverflow.com/questions/6349421/how-to-use-jackson-to-deserialise-an-array-of-objects – Maddy

+0

Я не знаю имена ключей для внутренних объектов JSON. –

ответ

1

Я думаю подход SACHIN является правильным направлением, но я хотел бы изменить его в следующем way, и удалить некоторые из вложенных карт, в которые он попадает,:

@JsonRootName("Parameters") 
public class Parameters { 
    private List<Parameter> parameters = new ArrayList<>(); 

    @JsonAnySetter 
    public void setDynamicProperty(String _ignored, Map<String, String> map) { 
     Parameter param = new Parameter(); 
     param.key = map.keySet().iterator().next(); 
     param.value = map.values().iterator().next(); 
     parameters.add(param); 
    } 

    public List<Parameter> getParameters() { 
     return parameters; 
    } 
} 

public class Parameter { 
    public String key, value; 
} 

После десериализации метод getParameters() вернет список из Parameter экземпляров. Учитывая ваш пример ввода, его структура будет выглядеть следующим образом, когда сериализовать в формате JSON:

[ 
    { 
    "key": "some key 0", 
    "value": "some value 0" 
    }, 
    { 
    "key": "some key 1", 
    "value": "some value 1" 
    }, 
    { 
    "key": "some key 2", 
    "value": "some value 2" 
    }, 
    { 
    "key": "some key n", 
    "value": "some value n" 
    } 
] 

Обратите внимание, что извлечение key и value использует итератор, который будет бросать исключение, если он встречает пустой объект.

2

Если клавиши являются динамическими, мы можем использовать аннотацию @JsonAnySetter.

Вы можете попробовать что-то вроде этого:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 

Parameters parameters = mapper.readValue(jsonData, Parameters.class); 

Где содержание Parameter класса будет:

@JsonRootName("Parameters") 
class Parameters { 
    private List<Map<String, String>> parameters = new ArrayList<Map<String, String>>(); 

    @JsonAnySetter 
    public void setDynamicProperty(String name, Map<String, String> map) { 
     parameters.add(map); 
    } 

    public List<Map<String, String>> getParameters() { 
     return parameters; 
    } 

    public void setParameters(List<Map<String, String>> parameters) { 
     this.parameters = parameters; 
    } 

} 
+0

Проблема в том, что у нас нет массива объектов в json. «0», «1», являются полями объекта json. –

+0

Да, вот почему я использовал аннотацию @JsonAnySetter. –

+0

Этот код отлично работает с вашим образцом json. –

Смежные вопросы