是否可以将字符串/整数声明为数字?

时间:2019-05-30 17:50:55

标签: java json string gson declaration

我想用Java解析JSON,但是我的JSON看起来像这样:

...
{
    "total_count": 16,
    "entries": [
        {
            "2": "1788",
            "3": "Yes", 
            "id": "2009131"
         },
         {
            "2": "956",
            "3": "No", 
            "id": "1381"
         }
...

我已经知道可以通过以下方式“提取”条目:

if(jsonTree.isJsonObject()){
            System.out.println("True");
            JsonObject jsonObject = jsonTree.getAsJsonObject();

            JsonElement f2 = jsonObject.get("entries");

现在我有一个JSON数组。为了与gson进行解析,我需要一个带有这样的变量的类(至少我认为是这样):

int 2;
String 3;

据我所知尚无定论。

是否有一种方法(前缀,语法?)实现?还是提取和分配具有正确ID的值的另一种方法?

2 个答案:

答案 0 :(得分:0)

您可以使用SerializedName批注,该批注允许定义与Java文件中的属性名称不同的字段名称。在下面,您可以看到示例如何将JSON有效负载反序列化为Java模型:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;

import java.io.File;
import java.io.FileReader;
import java.util.List;

public class GsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        Root root = gson.fromJson(new FileReader(jsonFile), Root.class);
        System.out.println(root);
    }
}

class Root {

    @SerializedName("total_count")
    private int totalCount;
    private List<Entry> entries;

    // getters, setters, toString
}

class Entry {
    private String id;

    @SerializedName("2")
    private String two;

    @SerializedName("3")
    private String three;

    // getters, setters, toString
}

上面的代码显示:

Root{totalCount=16, entries=[Entry{id='2009131', two='1788', three='Yes'}, Entry{id='1381', two='956', three='No'}]}

如果您的JSON是动态的并且可以具有更多/更少的密钥,则可以将其反序列化为Map<String, String>

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;

import java.io.File;
import java.io.FileReader;
import java.util.List;
import java.util.Map;

public class GsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        Root root = gson.fromJson(new FileReader(jsonFile), Root.class);
        System.out.println(root);
    }
}

class Root {

    @SerializedName("total_count")
    private int totalCount;
    private List<Map<String, String>> entries;

    // getters, setters, toString
}

上面的代码显示:

Root{totalCount=16, entries=[{2=1788, 3=Yes, id=2009131}, {2=956, 3=No, id=1381}]}

答案 1 :(得分:-1)

您可以创建一个对象“条目”,并在其中具有所有可能的变量。有JSON库可以为您完成转换。