2016-06-29 3 views
2

Я json'ed массив host, port, uri кортежей, кодируемых 3 участника как массив фиксированной длиной массивов:джексон десериализация массива в объект Java

[ 
    ["www1.example.com", "443", "/api/v1"], 
    ["proxy.example.com", "8089", "/api/v4"] 
] 

Я хотел бы использовать Джексон магию, чтобы получить список экземпляры

class Endpoint { 
    String host; 
    int port; 
    String uri; 
} 

Пожалуйста, помогите мне поставить правильные аннотации, чтобы ObjectMapper мог совершать магию.

Я не контролирует на подводящем формате и весь мой google'n заканчивается в ответах о том, как отобразить массив объектов собственно JSon (не массивы) в список объектов (например https://stackoverflow.com/a/6349488/707608)

=== рабочего раствора в соответствии с рекомендациями https://stackoverflow.com/users/59501/staxman в https://stackoverflow.com/a/38111311/707608

public static void main(String[] args) throws IOException { 
    String input = "" + 
      "[\n" + 
      " [\"www1.example.com\", \"443\", \"/api/v1\"],\n" + 
      " [\"proxy.example.com\", \"8089\", \"/api/v4\"]\n" + 
      "]"; 

    ObjectMapper om = new ObjectMapper(); 
    List<Endpoint> endpoints = om.readValue(input, 
     new TypeReference<List<Endpoint>>() {}); 

    System.out.println("endpoints = " + endpoints); 
} 

@JsonFormat(shape = JsonFormat.Shape.ARRAY) 
static class Endpoint { 
    @JsonProperty() String host; 
    @JsonProperty() int port; 
    @JsonProperty() String uri; 

    @Override 
    public String toString() { 
     return "Endpoint{host='" + host + '\'' + ", port='" + port + '\'' + ", uri='" + uri + '\'' + '}'; 
    } 
} 

ответ

7

Добавить следующую аннотацию:

@JsonFormat(shape=JsonFormat.Shape.ARRAY) 
class Endpoint { 
} 

и он должен сериализовать записи, как вы хотите.

Также: было бы безопаснее использовать @JsonPropertyOrder({ .... }) для принудительного исполнения определенного заказа, поскольку JVM может или не может выставлять поля или методы в каком-либо конкретном порядке.

+0

Большое спасибо, я получил волшебный рабочий код! –

0

Рассмотрим импортировать двумерный массив, а затем проходит через петлю. Тогда у вас может быть конструктор класса Endpoint, который принимает каждый экземпляр внутреннего массива.

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