【问题标题】:Get value of Json With Gson使用 Gson 获取 Json 的值
【发布时间】:2020-05-23 08:07:31
【问题描述】:

我不是来获取容器状态的名称的。 我试过这个(关于一个先例的帖子),错误是在 get("name") 上报告的“方法 get(String) is undefined for the type JsonElement”。

感谢您的帮助

JsonObject data = new Gson().fromJson(myjsoncontent, JsonObject.class);
JsonArray items = data .get("items").getAsJsonArray();      
    for(JsonElement element : items){
         JsonObject object = element.getAsJsonObject();
         String containerstatusesname = object.get("status").getAsJsonObject().get("containerStatuses").getAsJsonArray().get(0).get("name").getAsString();
}

// My Json Content

{
    "kind": "Space",
    "apiVersion": "v1",
    "metadata": {
        "selfLink": "something",
        "resourceVersion": "something"
    },
    "items": [
        {
            "status": {
                "containerStatuses": [
                 {
                   "name": "thisismyname"
                 }
                ]               
            }
        } 
    ]
}

【问题讨论】:

    标签: java arrays json spring-boot gson


    【解决方案1】:

    为什么要使用 gson 模拟 JSON.parse?正在用大锤敲碎坚果。

    如果您想使用 gson,最好创建一个与您的 json 数据匹配的类:

    public class ApiResponse {
    
        private String kind;
        private String apiVersion;
        private Metadata metadata;
        private List<Item> items;
    
        public List<String> getAllNames() {
            List<String> allNames = new ArrayList();
            for (Item item: items) {
                allNames.add(item.getStatus().get(0).getName());
            }
            return allNames;
        }
    
        public String getFirstName() {
            if (items.length == 0 || items.get(0).getStatus().length == 0) {
                return "";
            }
            return items.get(0).getStatus().get(0).getName();
        }
    
        class Metadata {
            private String selfLink;
            private String resourceVersion;
        }
    
        class Item {
            private List<StatusContainer> status;
    
            List<StatusContainer> getStatus() {
                return status;
            }
        }
    
        class StatusContainer {
            private String name;
    
            String getName() {
                return name;
            }
        }
    }
    

    然后执行:

    ApiResponse response = gson.fromJson(myjsoncontent, ApiResponse.class);
    String firstName = response.getFirstName();
    
    

    这样,响应对象将包含解析后的 json 的所有数据。请注意,如果保持私有,您需要添加 getter 才能访问此属性。

    无需模拟JSON.parse的结果,有JsonObject、JsonArray...

    【讨论】:

    • 如果我使用您的解决方案,(我是 java 新手..),我如何遍历列表,如何获得研究名称的值?谢谢在我的第一次尝试中,我正在这样做,但是另一个解决方案说我要使用 JsonArray ...
    • 带吸气剂。我为这种特定情况添加了一个 getter 示例,但您应该看看 getter 是如何工作的。请注意示例代码中的 Metadata、Item 和 StatusContainer 以及它们的 getter 是包私有的,它不必是这种方式,但如果它们是包私有的,那么访问您想要的数据的公共 getter 必须在 ApiResponse 中这是公共课。
    • 感谢编辑,我理解得更好了,但是(getStatus.get(0) 有 2 个错误)=> getStatus cannot be resolved or is not a field
    • 我现在正在尝试你的代码,但我得到了一个java.lang.NullPointerException: nullPodsApiResponse podscontent = new Gson().fromJson(response, PodsApiResponse.class);System.out.println(podscontent.getFirstName());String jsonofresult = podscontent.getFirstName();return jsonofresult;
    • 检查您现在收到的响应,它可能没有名称的状态。在这种情况下,如果您不更改 getFirstName() 代码并在访问响应之前检查每个项目是否存在于响应中,它将引发空指针异常。或者您可以在该方法中重新抛出错误并在外部捕获该错误,有多种方法可以解决此问题。 JsonObject 也会发生同样的情况,您还必须检查每个元素是否存在。
    【解决方案2】:

    你必须改变

    .get(0).get("name")
    

    .get(0).getAsJsonObject().get("name")
    

    JsonArray 迭代时返回JsonElements

    【讨论】:

      【解决方案3】:

      将数组元素作为对象获取,使其结构化为对象

      .getAsJsonArray().get(0).getAsJsonObject().get("name").getAsString();
      

      【讨论】:

        猜你喜欢
        • 2017-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 2019-02-12
        • 2023-04-02
        相关资源
        最近更新 更多