Простое преобразование Json в Java с использованием GSON - PullRequest
4 голосов
/ 13 февраля 2011

Я недавно начал использовать библиотеку GSON для десериализации JSON, которая поступает из веб-сервиса, но я не могу заставить его работать.Я решил проверить GSON на каком-то простом входе - не могу сделать его проще и все равно не работает.Я просматривал похожие проблемы, такие как Преобразование JSON в Java , и все они предлагают сходный подход к решению.Я предполагаю, что мне не хватает чего-то действительно простого и очевидного, поэтому, возможно, поможет новый взгляд на код.Итак, вот что у меня есть:

JSON

{"A":{"name":"qwrety","value1":1,"value2":2}}

Java класс

import com.google.gson.Gson;

public class Main {

    public static void main(String[] args) {        
        String json = /*getting JSON from server*/       
        Gson gson = new Gson();
        A obj = gson.fromJson(json, A.class);
        System.out.println(obj);
    }
}

class A {
    private String name;
    private int value1;
    private int value2;

    public String getName() { return name; }
    public int getValue1() { return value1; }
    public int getValue2() { return value2; }

    public void setName(String name) { this.name = name; }
    public void setValue1(int value1) { this.value1 = value1; }
    public void setValue2(int value2) { this.value2 = value2; }

    public String toString() {
        return String.format("name: %s, value1: %d, value2: %d", name, value1, value2);
    }
}

Что я получаю взамен

name: null, value1: 0, value2: 0

Любойможете сказать, что не так с этим кодом?

UPD Как отметили @torbinsky и @ Kevin-Dolan, проблема заключалась в том, что структура классов Java не соответствовала формату Json.Чтобы исправить это, я добавил новый класс

class Container {
    private A a;

    public A getA() { return a; }

    public void setA(A a) { this.a = a; }

}

и изменил вызов десериализации на следующий

Gson gson = new Gson();
Container obj = gson.fromJson(json, Container.class);

System.out.println(obj.getA());

Однако я все равно получаю "null" распечатанный

Ответы [ 3 ]

4 голосов
/ 13 февраля 2011

Я думаю, что ваша проблема в вашей строке JSON.

Попробуйте изменить:

{"A":{"name":"qwrety","value1":1,"value2":2}}

до:

{"name":"qwrety","value1":1,"value2":2}

EDIT: Я думаю, что проблема может заключаться в том, что ваша строка JSON имеет "A", и это с учетом регистра. Попробуйте изменить переменную-член в верхний регистр "A". Извините, я не могу проверить в данный момент, чтобы подтвердить это.

Если формат JSON фиксированный, попробуйте изменить классы на что-то похожее:

class Foo {
private String name;
private int value1;
private int value2;

public String getName() { return name; }
public int getValue1() { return value1; }
public int getValue2() { return value2; }

public void setName(String name) { this.name = name; }
public void setValue1(int value1) { this.value1 = value1; }
public void setValue2(int value2) { this.value2 = value2; }

public String toString() {
    return String.format("name: %s, value1: %d, value2: %d", name, value1, value2);
}
}

и:

class Container {
private Foo A;

public Foo getA() { return A; }

public void setA(Foo A) { this.A = A; }
}
2 голосов
/ 13 февраля 2011

Проблема в том, что он ищет поле в вашем объекте с именем "A", но вместо этого он находит поля "name", "value1" и "value2".

JSON, который вы хотите отправить в gson:

{"name":"qwrety","value1":1,"value2":2}
1 голос
/ 13 февраля 2011

После изменений имя вашего поля все еще "a", но JSON использует "A". Поэтому вам нужно либо переименовать поле, либо добавить аннотацию, чтобы указать, что JSON использует «A» в качестве имени (я думаю, @SerializedName («A»)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...