разбирать массив / объект JSON с помощью Gson в Java - PullRequest
0 голосов
/ 29 апреля 2018

Я хочу проанализировать файл JSON в JAVA, используя GSON, и формат файла следующий:

{
"parcel":[
    {
        "firstName": "ABC",
        "lastName": "LAST",
        "email": "abc.LAST@g.com",
        "country": "United States",
        "dates": [
            "2013-05-01",
            "2014-05-07"
        ]
    },
    {
        "firstName": "CVS",
        "lastName": "Bad",
        "email": "cvs.Bad@g.com",
        "country": "Iceland",
        "dates": [
            "2010-04-30",
            "2011-01-01",

        ]
    }
    ]

}

И мой основной метод в публичном классе выглядит так:

    public static void main(String[] args) throws IOException {
       try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("input.json"), "UTF-8")){
        Gson gson = new GsonBuilder().create();
        Parcel p = gson.fromJson(reader, Parcel.class);
        System.out.println(p);
       }
}

И следующий код для посылки:

public class Parcel {

Data data;

@Override
public String toString() {
    return "Parcel [data=" + data + "]";
}

public Data getData() {
    return data;
}

public void setData(Data data) {
    this.data = data;
}
}
class Data{
public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getCountry() {
    return country;
}

public void setCountry(String country) {
    this.country = country;
}

public Arrays[] getAvailableDates() {
    return dates;
}

public void setAvailableDates(Arrays[] dates) {
    this.dates = dates;
}

@Override
public String toString() {
    return "Data [firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + ", country=" + country
            + ", dates=" + Arrays.toString(dates) + "]";
}

private String firstName;

private String lastName;

private String email;

private String country;

private Arrays[] dates;

}

Но я не могу найти правильный способ сохранить все значения переменных в списке. Прямо сейчас все, что я получаю, это Parcel [data = null].

1 Ответ

0 голосов
/ 29 апреля 2018

Хорошо, входные данные JSON и ваша иерархия классов должны быть совместимы. Теперь у вас есть класс Parcel с одним атрибутом Data с именем "data". Между тем ваш JSON - это объект с атрибутом с именем «class». Таким образом, gson не находит свойство "class" в классе Parcel, а атрибут "data" get игнорируется.

Во-вторых, в вашем JSON есть массив данных вместо одного экземпляра данных, поэтому вам придется создать из него массив.

Так что это должно работать лучше:

import com.google.gson.annotations.SerializedName;

public class Parcel {
    @SerializedName("class")
    Data[] data;

    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();

        result.append("Parcel [data=");

        for(Data singleData : data) {
            if (singleData != data[0]) {
                result.append(", ");
            }

            result.append(singleData.toString());
        }

        result.append("]");

        return result.toString();
    }
}

Это может привести к сбою, так как вы пропустили класс «Массивы», который вы использовали в классе Data. Если вы измените тип с Arrays на String, он должен работать.

Также я использовал аннотацию @SerializedName для сопоставления свойства data со свойством class, поскольку class - это ключевое слово в java.


Решение с пропуском корневого элемента («посылки»):

try(Reader reader = new InputStreamReader(new ByteArrayInputStream(jsonString1.getBytes()), "UTF-8")){
    Gson gson = new GsonBuilder().create();

    JsonElement rootElement = gson.fromJson(reader, JsonObject.class).get("parcel");
    Data[] parcels = gson.fromJson(rootElement, Data[].class);
    for (Data parcel : parcels) {
        System.out.println(parcel);
    }
}
...