【问题标题】:How to parse JSON and get only one field?如何解析 JSON 并只获取一个字段?
【发布时间】:2021-12-29 05:37:24
【问题描述】:

我正在接收我想要解析的 JSON:

[
    {
        "id": "f9952c24-1b44-4379-9aef-b10075e93562",
        "sections": [
            {
                "id": "7fe9f47e-9cfe-46c7-9c77-f729b9fb98a4",
                "type": "vehicle",
                "summary": {
                    "duration": 23377,
                    "length": 480501,
                    "baseDuration": 22140
                }
            }
        ]
    }
]

我的 Java 模型类(由 json2pojo 生成):

public class HereRoute {
  @SerializedName("routes")
  @Expose
  private List<Route> routes = null;
}

public class Route {
  @SerializedName("id")
  @Expose
  private String id;
  @SerializedName("sections")
  @Expose
  private List<Section> sections = null;
}

public class Section {
  @SerializedName("id")
  @Expose
  private String id;
  @SerializedName("type")
  @Expose
  private String type;
  @SerializedName("summary")
  @Expose
  private Summary summary;
  }

public class Summary {
  @SerializedName("duration")
  @Expose
  private Integer duration;
  @SerializedName("length")
  @Expose
  private Integer length;
  @SerializedName("baseDuration")
  @Expose
  private Integer baseDuration;
}

我只对要保存在数据库中的摘要长度感兴趣。 如何解析它以仅从 json 中获取每个对象的摘要长度? 我需要像 Gson 这样的东西吗?

【问题讨论】:

标签: java json parsing


【解决方案1】:

首先在您的项目中包含JSON 库。

然后像这样遍历您的 JSON:

JSONArray firstLevelArrray = new JSONArray(jsonString); // Getting the big array

for(int i = 0 ; i < firstLevelArrray.length(); i++)
{
    Integer length = firstLevelArray.getJSONObject(i) // getting the first object of the array
               .getJSONArray("sections") // Getting the sections array
               .getJSONObject(0) // Getting the first element of the sections array
               .getJSONObject("summary")
               .getInt("length");
               
    // But how sure are you that you won't have a null in there?
}

我还是不会走这条路,NullPointerException 的可能性很大。您可以随时处理它并将其视为该字段不存在,但仍然...

【讨论】:

    【解决方案2】:

    您可以使用“jackson”进行反序列化。

    使用 maven 包含依赖项

    <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.13.0</version>
    </dependency>
    

    使用 ObjectMapper 反序列化您的 JSON 字符串。

    ObjectMapper mapper = new ObjectMapper();
    data = mapper.readValue(json, Data[].class);
    

    一个完整的工作示例如下

    import java.io.IOException;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    public class Test {
    
    static String json = "[\r\n"
            + "    {\r\n"
            + "        \"id\": \"f9952c24-1b44-4379-9aef-b10075e93562\",\r\n"
            + "        \"sections\": [\r\n"
            + "            {\r\n"
            + "                \"id\": \"7fe9f47e-9cfe-46c7-9c77- 
    f729b9fb98a4\",\r\n"
            + "                \"type\": \"vehicle\",\r\n"
            + "                \"summary\": {\r\n"
            + "                    \"duration\": 23377,\r\n"
            + "                    \"length\": 480501,\r\n"
            + "                    \"baseDuration\": 22140\r\n"
            + "                }\r\n"
            + "            }\r\n"
            + "        ]\r\n"
            + "    }\r\n"
            + "]";
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        Test.Data data[] = null;
        try {
            data = mapper.readValue(json, Data[].class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        System.out.println(data[0].sections[0].summary.length);
    
    }
    
    private static class Data {
        String id;
        Sections sections[];
    
        public Data() {
            super();
        }
    
        public Data(String id, Test.Sections[] sections) {
            super();
            this.id = id;
            this.sections = sections;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public Sections[] getSections() {
            return sections;
        }
    
        public void setSections(Sections[] sections) {
            this.sections = sections;
        }
    
    }
    
    private static class Sections {
        private String id;
        private String type;
        private Summary summary;
    
        public Sections() {
            super();
        }
    
        public Sections(String id, String type, Test.Summary summary) {
            super();
            this.id = id;
            this.type = type;
            this.summary = summary;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        public Summary getSummary() {
            return summary;
        }
    
        public void setSummary(Summary summary) {
            this.summary = summary;
        }
    
    }
    
    private static class Summary {
        private Integer duration;
        private Integer length;
        private Integer baseDuration;
    
        public Summary() {
            super();
        }
    
        public Summary(Integer duration, Integer length, Integer baseDuration) {
            super();
            this.duration = duration;
            this.length = length;
            this.baseDuration = baseDuration;
        }
    
        public Integer getDuration() {
            return duration;
        }
    
        public void setDuration(Integer duration) {
            this.duration = duration;
        }
    
        public Integer getLength() {
            return length;
        }
    
        public void setLength(Integer length) {
            this.length = length;
        }
    
        public Integer getBaseDuration() {
            return baseDuration;
        }
    
        public void setBaseDuration(Integer baseDuration) {
            this.baseDuration = baseDuration;
        }
    
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多