Java:正确的类型迭代

Java:正确的类型迭代,java,android,json,Java,Android,Json,我从Google Maps获得了此JSON,并成功地将其转换为GSON对象: { "long_name" : "1", "short_name" : "1", "types" : [ "street_number" ] }, { "long_name" : "ABC Street", "short_name" : "ABC Street",

我从Google Maps获得了此JSON,并成功地将其转换为GSON对象:

        {
           "long_name" : "1",
           "short_name" : "1",
           "types" : [ "street_number" ]
        },
        {
           "long_name" : "ABC Street",
           "short_name" : "ABC Street",
           "types" : [ "route" ]
        },
        {
           "long_name" : "ABC Town",
           "short_name" : "ABC",
           "types" : [ "locality", "political" ]
        },
        {
           "long_name" : "ABC Area",
           "short_name" : "ABCA",
           "types" : [ "administrative_area_level_2", "political" ]
        },
        {
           "long_name" : "ABC L",
           "short_name" : "ABCL",
           "types" : [ "administrative_area_level_1", "political" ]
        },
        {
           "long_name" : "Country",
           "short_name" : "CT",
           "types" : [ "country", "political" ]
        },
        {
           "long_name" : "1234",
           "short_name" : "1234",
           "types" : [ "postal_code" ]
        }
我现在应该如何遍历我的类型?我需要将街道、街道号和城镇分别保存在自己的字段中。我唯一想到的是这个,但在我看来不太好:

class address_component{
    public String long_name;
    public String short_name;
    public String[] types;
}

当然,还可以通过每个地址组件进行循环。如何才能做得更好?

类型数组中的每个数组都有一个或两个记录长,您只需要查找三种数据类型。在您的方法中有一些浪费的工作,但是当前形式的
包含(String)
不会浪费太多的工作,因为数字太小了

避免不必要工作的一个明显方法是在找到街道后停止进一步的
contains(“street”)
检查,对于其他字段也是如此。这可能是一个简单的额外条件:

if (types.contains("street_number")) {
   street_number = short_name
} else if (types.contains("route")) {
   street = short_name
}
你没有发布足够的代码来说明你在做什么。我看到了两个潜在的问题,它们的成本比您所问的if-contains-else-if-contains部分要大得多

  • 在搜索数据时,您正在迭代这些地址类型记录中的七个(或更多)。一旦你有了所需的三个项目,你是否会
    中断
    迭代并跳过更多的地址类型
  • 您的代码是在开始处理之前将整个JSON结构加载到内存中,还是采用流式处理方法
  • 最大的麻烦是仔细查看您正在查询的API的文档。如果有一种方法可以告诉服务器您正在查找哪些数据类型,那么服务器可以从响应中过滤您不需要的所有内容。您仍将进行迭代,但不会丢弃这么多数据。这节省了移动设备上的带宽、内存和CPU。服务器有很多这样的功能,所以最好让它来完成这项工作

  • 您应该使用for循环来迭代。。。我不知道你想完成什么,或者你是如何做到的。。。完整的代码会很好,所以我知道您是如何尝试存储值的。您将这些字段保存到哪里?对于每个
    address\u组件
    您都有一个类型数组,您需要如何处理这些类型?更多的上下文会有所帮助。没什么特别的,我没有一个地址对象,包括,fields street,street number,city,country等等。嗯,street number,street等等并不总是以相同的顺序排列。我需要通过检查types数组来知道哪些JSON对象是street、street number等。根据文档,您的方法没有错。地理编码api不会为每个输入返回相同的结果,因此检查字段是否存在而不是假设字段是正确的。只需在JSONArray上使用for循环,并首先检查类型。如果值匹配,则抓取外部JSON对象。感谢您的回答!好吧,看来我的方法并不像我想的那么糟糕。感谢空检查的想法,这是一个更好的表现。1。我实际上是通过GSON创建一个对象,我只是在需要的字段上迭代。两个人。我的代码确实每次都加载整个JSON,但它没有那么长。。。流式方法不会很困难,因为我再也不能创建GJSON对象了。三个人。这是谷歌地图API,据我所知,它不起作用。。。
    if (street_number == null && types.contains("street_number")) {
      street_number = short_name
    } else if (street == null && types.contains("route")) {
      street = short_name 
    }