使用GSON进行简单的Json转Java操作

4
我最近开始使用GSON库对来自Web服务的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

有人能指出这段代码哪里出了问题吗?

更新 正如@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
我认为你的问题出在JSON字符串上。请尝试更改以下内容:
{"A":{"name":"qwrety","value1":1,"value2":2}}

to:

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

编辑: 我认为问题可能出在你的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);
}
}

and:

class Container {
private Foo A;

public Foo getA() { return A; }

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

谢谢,你说得对,将json更改为您建议的那个确实有效,但正如我所说,我正在从Web服务获取json,因此无法真正更改其格式。您的答案给了我一个想法,引入新类->class Container { private A a; public A getA() { return a; } public void setA(A a) { this.a = a; } }并进行反序列化->Container obj = gson.fromJson(json, Container.class);但是当我打印obj.getA()时,仍然得到null - IvanR
我认为问题可能是你的JSON字符串有一个"A",而且它是大小写敏感的。尝试将成员变量更改为大写的"A"。很抱歉我现在无法测试以确认这一点。 - torbinsky

2
问题在于,它正在寻找你的对象中名为"A"的字段,但实际上它找到了"name"、"value1"和"value2"字段。
你想要发送给gson的json是:
{"name":"qwrety","value1":1,"value2":2}

1

修改后,你的字段名仍为"a",但是JSON使用"A"。所以你需要要么重命名字段,要么添加注解来指示JSON使用"A"作为名称(我认为应该使用@SerializedName("A")注解)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接