Преобразовать объект JSON в объект Java с другим форматом, используя GSON - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть ответ, который возвращает объект json в следующем формате:

{
    "playerId": "001",
    "name": "michel",
    "age": 21,
    "nation": "USA",
    "ratings": [
        {
            "type": "speed",
            "score": "0121"
        },
        {
            "type": "accuracy",
            "score": "85"
        }
    ],
    "teaminfo": {
        "teamName": "HON",
        "isValid": "true"
    }
}

и у меня есть класс Java как:

public class MyRider {
    public String playerId;
    public String name;
    public int age;
    public String speed;
    public String accuracy;
    public String teamName;
    public String isValid;
    //getter, setter... 
}

Я хочу отобразить объект JSON в объект Java с помощью GSON.

Я попытался использовать JsonDeserializationContext deserialize, и он вернул null для вложенных значений в JSON.

1 Ответ

0 голосов
/ 18 сентября 2018

Без пользовательского десериализатора

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

MyRider:

public class MyRider {
    private String playerId;
    private String name;
    private int age;
    private String nation;
    private List<Rating> ratings;
    private TeamInfo teaminfo;

    // getters, setters, toString override
}

Оценка:

public class Rating {
    private String type;
    private String score;

    // getters, setters, toString override
}

TeamInfo:

private static class TeamInfo {
    private String teamName;
    private String isValid;

    // getters, setters, toString override
}

Затем просто десериализовать как обычно:

MyRider rider = gson.fromJson(json, MyRider.class);

Если вам нужны именно те поля, которые вы указали в MyRider в своем вопросе, рассмотрите класс преобразователя, чтобы сопоставить полный класс выше с вашими потребностями.

С пользовательским десериализатором

Это также возможно сделать с помощью специального десериализатора, но немного бессмысленно, поскольку GSON предоставляет вам нормальное отображение, которое вы затем можете адаптировать.

Вот пример с десериализатором:

public class MyRiderDeserializer implements JsonDeserializer<MyRider> {

    @Override
    public MyRider deserialize(JsonElement json, Type typeOfT, 
                               JsonDeserializationContext context)
                               throws JsonParseException {
        MyRider rider = new MyRider();
        if(json.isJsonObject()) {
            JsonObject riderObj = json.getAsJsonObject();

            rider.setPlayerId(riderObj.get("playerId").getAsString());
            rider.setName(riderObj.get("name").getAsString());
            rider.setAge(riderObj.get("age").getAsInt());

            JsonArray ratingsArray = riderObj.get("ratings").getAsJsonArray();
            for(JsonElement ratingElem : ratingsArray) {
                JsonObject ratingObj = ratingElem.getAsJsonObject();
                String type = ratingObj.get("type").getAsString();
                switch(type) {
                    case "speed":
                        rider.setSpeed(ratingObj.get("score").getAsString());
                        break;
                    case "accuracy":
                        rider.setAccuracy(ratingObj.get("score").getAsString());
                        break;
                    default:
                        break;
                }
            }

            JsonObject teamInfo = riderObj.get("teaminfo").getAsJsonObject();
            rider.setTeamName(teamInfo.get("teamName").getAsString());
            rider.setIsValid(teamInfo.get("isValid").getAsString());

        }
        return rider;
    }
}

Обратите внимание, что это не включает каких-либо проверок, чтобы проверить, действительно ли свойства там, и является самым простым из возможных пользовательских десериализаторов, которые я мог придумать. Чтобы использовать его, необходимо зарегистрировать адаптер типа в Gson время создания:

Gson gson = new GsonBuilder()
                .registerTypeAdapter(MyRider.class, new MyRiderDeserializer())
                .create();

MyRider myRider = gson.fromJson(reader, MyRider.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...