【问题标题】:Parse JSON to Java Object using GSON使用 GSON 将 JSON 解析为 Java 对象
【发布时间】:2015-01-07 13:04:43
【问题描述】:

我正在尝试将 jenkins API 中的 json 文档映射到我自己的 java 对象。 json 文档如下所示:

{
    "assignedLabels": [
        {}
    ],
    "mode": "EXCLUSIVE",
    "nodeDescription": "Jenkins Master-Knoten",
    "nodeName": "",
    "numExecutors": 2,
    "description": null,
    "jobs": [
        {
            "name": "Job 1",
            "url": "https://build.example.com/jenkins/job/Job1/",
            "color": "disabled"
        },
        {
            "name": "Job 2",
            "url": "https://build.example.com/jenkins/job/Job2/",
            "color": "blue"
        }
    ],
    "overallLoad": {},
    "primaryView": {
        "name": "Alle",
        "url": "https://build.example.com/jenkins/"
    },
    "quietingDown": false,
    "slaveAgentPort": 0,
    "unlabeledLoad": {},
    "useCrumbs": false,
    "useSecurity": true,
    "views": [
        {
            "name": "Selection",
            "url": "https://build.example.com/jenkins/view/-All%Selection/"
        },
        {
            "name": "All",
            "url": "https://build.example.com/jenkins/"
        }
    ]
}

我的 java 模型如下所示:

public class JenkinsServer {
    private List<String> assignedLabels;
    private String url;

    private String mode;
    private String nodeName;
    private String nodeDescription;
    private String description;

    private boolean useSecurity;
    private boolean quietingDown;

    private JenkinsServerView primaryView;
    private List<JenkinsServerView> views;
    private List<JenkinsJob> jobs;

    // getters & setters
}

我现在做的是我打电话

Gson gson = new Gson();
JenkinsServer server = gson.fromJson( reader, JenkinsServer.class );

但是我收到了这个异常

Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 6 column 5
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)

我一直在互联网上寻找解决方案,但无法弄清楚我做错了什么。也许你们知道:-)

【问题讨论】:

  • 嗯,我看到的一件事是您的代码中的assignedLabels 是一个字符串列表,而在数据中它是一个带有空对象的数组。我建议您不要尝试一次性解析整个文件,而是继续向文件和 Java 对象添加更多属性;迭代地执行它可以更容易地知道数据结构中哪里存在不匹配。
  • 参考这个例子。它可能会帮助你。 mkyong.com/java/…

标签: java json parsing jenkins gson


【解决方案1】:

正如评论中提到的@Gimby,问题出在您的 json 数据中。

解决方案 1:

由于assignedLabels 是一个包含空值的字符串数组,一种选择是更改不带花括号的json 数据,如下所示:

"assignedLabels": []

解决方案 2:

在java类的变量中添加transient关键字

private transient List<String> assignedLabels;

解决方案 3:

最后一个笨拙的实现方法是将@Expose注解添加到你想要在你的java类中解析的所有变量

public class JenkinsServer {
    private List<String> assignedLabels;

    @Expose
    private String url;

    @Expose
    private String mode;

    @Expose
    private String nodeName;

    @Expose
    private String nodeDescription;

    @Expose
    private String description;

    @Expose
    private boolean useSecurity;

    @Expose
    private boolean quietingDown;

    @Expose
    private JenkinsServerView primaryView;

    @Expose
    private List<JenkinsServerView> views;

    @Expose
    private List<JenkinsJob> jobs;

    // getters & setters methods
}

然后添加解析逻辑,将你的json字符串解析为对应的java对象,如下:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();      
JenkinsServer server = gson.fromJson(reader, JenkinsServer.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2011-04-26
    相关资源
    最近更新 更多