簡體   English   中英

使用GSON的簡單Json到Java轉換

[英]Simple Json to Java convertion using GSON

我最近開始使用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

任何人都可以說出這段代碼有什么問題嗎?

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”

我認為您的問題是您的JSON字符串。

嘗試更改:

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

至:

{"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);
}
}

和:

class Container {
private Foo A;

public Foo getA() { return A; }

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

問題是,它正在對象中查找一個名為“ A”的字段,但是卻在查找“名稱”,“ value1”和“ value2”字段。

您要發送給gson的json是:

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

更改后,您的字段名稱仍為“ a”,但JSON使用“ A”。 因此,您需要重命名字段,或添加注釋以指示JSON使用“ A”作為名稱(我認為@SerializedName(“ A”))。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM