在 Java 中使用 Gson 从嵌套对象读取单个值



下面是我的Json。我想使用 Gson 在"详细信息"中获取"Id"的值

{
    "name": "testAutomation-1",
    "owner": "TestUSer",
    "description": "testAutomation-1",
    "subSet": [
        "test-audit"
    ],
    "labels": "{"engagementType":"Sx","type":"collect"}",
    "createdTime": 1548508294790,
    "updatedTime": 1548654725381,
    "scheduleDateTime": null,
    "timeZone": null,
    "jobStatus": "Report-Requested",
    "loggedInUser": null,
    "Details": [
        {
            "Status": "Completed",
            "Id": "fe1f6b40-216b-11e9-a769-25be4c5889e7"
        }
    ]
}

我使用以下代码创建了一个地图。但不确定如何获取值

Map<String, Object> createmap = new HashMap<String, Object>();
Gson gson = new Gson();
Type type = new TypeToken<Map<String, Object>>(){}.getType();
createmap = gson.fromJson(jsonobj.toString(), type);

假设你需要数组的第一个元素,你可以做这样的事情(知道DATA是你提供的 JSon 字符串):

Map<String, JsonElement> resultMap;
Gson gson = new Gson();
Type type = new TypeToken<Map<String, JsonElement>>() {}.getType();
JsonElement jsonElement = gson.fromJson(DATA, JsonElement.class);
resultMap = gson.fromJson(jsonElement.toString(), type);
JsonArray details = resultMap.get("Details").getAsJsonArray();
JsonObject recordElement = details.get(0).getAsJsonObject();
System.out.println(recordElement.get("Id").getAsString());

所有这些只是将Details数组作为JsonArray获取,然后获取Id元素的值。

由于您似乎正在处理 UUID,因此您可能可以从使用以下内容中受益:

UUID uuid = UUID.fromString(recordElement.get("Id").getAsString());

根据 Gson 指南,您需要使用正确的参数化类型而不是泛型类型。然后,您可以从地图中轻松访问所需的值。

Map<String, Dummy> map = new HashMap<String, Dummy>();
Type t = new TypeToken<Map<String, Dummy>>() {}.getType();
map = new Gson().fromJson(jsonobj.toString(), type);

然后你可以得到映射值(map.get("details")并从中读取id。

在你的 JSON Details中是一个列表或数组。因此,在某些情况下,不仅有一个id,您也应该为此做好准备。

创建 DTO来描述数据通常也是一个好习惯,就像下面的两个类一样:

数据

@Getter
public class Data {
    // Recommendation, in Java field name should start lower case
    @SerializedName("Details")
    List<Detail> details; // Could be some List also
}

细节

@Getter
public class Detail {
    // Recommendation, in Java field name should start lower case
    @SerializedName("Id")
    private UUID id;
}

这也允许以后灵活地从同一个 JSON 中选取您需要的任何其他字段。

序列化您的 JSON,如下所示:

Data data = gson.fromJson(YOUR_JSON, Data.class);

检查 ID - 例如 - 例如:

data.getDetails().forEach(d -> log.info("{}", d.getId()));

最新更新