Учитывая, что у меня есть следующий json:

{
    "Company": {
        "name": "cookieltd",
        "type": "food",
        "franchise_location": [
            {
                "location_type": "town",
                "address_1": "5street"
            },
            {
                "location_type": "village",
                "address_1": "2road"
            }
        ]
    }
}

Как его можно привязать к следующим классам объектов с помощью Джексона ?:

1) Класс компании

public class Company
{
    String name, type;
    List<Location> franchise_location = new ArrayList<Location>();

    [getters and setters]
}

2) Класс местоположения

public class Location
{
    String location_type, address_1;

    [getters and setters]

}

Я сделал:

String content = [json above];
ObjectReader reader = mapper.reader(Company.class).withRootName("Company"); //read after the root name
Company company = reader.readValue(content);

Но я получаю:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "franchise_location"
0
obsessiveCookie 27 Дек 2013 в 05:41

2 ответа

Лучший ответ

Насколько я могу судить, вам просто не хватает геттера с подходящим названием для поля franchise_location. Должен быть

public List<Location> getFranchise_location() {
    return franchise_location;
}

(и сеттер)

public void setFranchise_location(List<Location> franchise_location) {
    this.franchise_location = franchise_location;
}

В качестве альтернативы вы можете аннотировать свой текущий получатель или поле с помощью

@JsonProperty("franchise_location")
private List<Location> franchiseLocation = ...;

Который помогает сопоставить имена элементов JSON, которые на самом деле не работают с соглашениями об именах полей Java.


Следующее работает для меня

public static void main(String[] args) throws Exception {
    String json = "{ \"Company\": { \"name\": \"cookieltd\", \"type\": \"food\", \"franchise_location\": [ { \"location_type\": \"town\", \"address_1\": \"5street\" }, { \"location_type\": \"village\", \"address_1\": \"2road\" } ] } }";
    ObjectMapper mapper = new ObjectMapper();
    ObjectReader reader = mapper.reader(Company.class).withRootName(
            "Company"); // read after the root name
    Company company = reader.readValue(json);
    System.out.println(company.getFranchise_location().get(0).getAddress_1());
}

public static class Company {
    private String name;
    private String type;
    private List<Location> franchise_location = new ArrayList<Location>();

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public List<Location> getFranchise_location() {
        return franchise_location;
    }
    public void setFranchise_location(List<Location> franchise_location) {
        this.franchise_location = franchise_location;
    }
}

public static class Location {
    private String location_type;
    private String address_1;
    public String getLocation_type() {
        return location_type;
    }
    public void setLocation_type(String location_type) {
        this.location_type = location_type;
    }
    public String getAddress_1() {
        return address_1;
    }
    public void setAddress_1(String address_1) {
        this.address_1 = address_1;
    }
}

И печатает

5street
0
Sotirios Delimanolis 27 Дек 2013 в 02:02

Мое решение для JSON всегда GSON, вы можете изучить что, если у вас есть правильная структура класса в соответствии с JSON, он может автоматически переноситься из JSON в объект:
Company company = gson.fromJson(json, Company.class);
GSON настолько умен, чтобы заниматься конвертацией! наслаждайтесь GSON!

-2
Rugal 27 Дек 2013 в 02:28