Android 在不确定后台返回json格式时,如何解析数据

前面一篇文章我介绍了Gson的解析的基本方法。但我们在享受Gson解析的高度封装带来的便利时,有时可能会遇到一些特殊情况,比如json数据中的字段key是动态可变的时候,由于Gson是使用静态注解的方式来设置实体对象的,因此我们很难直接对返回的类型来判断。但Gson在解析过程中如果不知道解析的字段,就会将所有变量存储在一个Map中,我们只要实例化这个map就能动态地取出key和value了。

先给出一段jsondata,这是天气预报的数据,其中day_20151002这种key是随日期而变化的,在实体类中就不能当做静态变量来处理,我们就通过map来取出其映射对象。

{ "resultcode":"200","reason":"successed!",
    "result":{
            "sk":{
                 "temp":"24","wind_direction":"东北风","wind_strength":"2级","humidity":"28%","time":"17:38"
                  },
         "today":{
                 "temperature":"15℃~26℃","weather":"多云转晴","wind":"东北风微风","week":"星期日","city":"桂林","date_y":"2015年10月11日","dressing_index":"舒适","dressing_advice":"建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。","uv_index":"弱","comfort_index":"","wash_index":"较适宜","travel_index":"较适宜","exercise_index":"较适宜","drying_index":""
                 },
        "future":{
                 "day_20151011":{"temperature":"15℃~26℃","weather":"多云转晴","wind":"东北风微风","week":"星期日","date":"20151011"},
                 "day_20151012":{"temperature":"16℃~27℃","weather":"晴转多云","wind":"微风","week":"星期一","date":"20151012"},
                 "day_20151013":{"temperature":"16℃~26℃","weather":"多云转晴",,"wind":"微风","week":"星期二","date":"20151013"},
                 "day_20151014":{"temperature":"17℃~27℃","weather":"晴","wind":"北风微风","week":"星期三","date":"20151014"},
                 "day_20151015":{"temperature":"17℃~28℃","weather":"晴","wind":"北风微风","week":"星期四","date":"20151015"},
                 "day_20151016":{"temperature":"17℃~30℃","weather":"晴","wind":"北风微风","week":"星期五","date":"20151016"},
                 "day_20151017":{"temperature":"17℃~30℃","weather":"晴","wind":"北风微风","week":"星期六","date":"20151017"}
                 }
              },
    "error_code":0
}

实体类中放上set、get和toString方法就太长了,这里就没有加上去。


public class FutureDay {
    private String temperature;
    private String weather;
    private String wind;
    private String week;
    private String date;
}

public class Result {
    private Sk sk;
    private Today today;
    private Map<String,FutureDay> future;
}

public class Sk {
    private String temp;
    private String wind_direction;
    private String wind_strength;
    private String humidity;
    private String time;
}
public class Today {
    private String temperature;
    private String weather;
    private String week;
    private String city;
    private String date_y;
    private String dressing_index;
    private String dressing_advice;
    private String uv_index;
    private String comfort_index;
    private String wash_index;
    private String travel_index;
    private String exercise_index;
    private String drying_index;
}

public class Response {
    private String resultcode;
    private String reason;
    private String error_code;
    private Result result;
}

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Map;
import weather.*;
import com.google.gson.Gson;
 
 
public class GsonParseDynamicKey {
    public static  void main( String args []){
        String jsondata = readJsonFile();//从文件中读取出json字符串,并打印出来
        Gson gson = new Gson();
        System.out.println("Start Gson parse jsondata");   
        Response response = gson.fromJson(jsondata, Response.class);        
        System.out.println(response.toString());
        System.out.println(response.getResult().getSk().toString());
        System.out.println(response.getResult().getToday().toString());
 
        Map<String, FutureDay> future = response.getResult().getFuture(); //对动态的key,来创建map,间接从中取出实体类futrue。
        System.out.println("Keyset method");                     //这里取出value的方法有两种keySet() entrySet().都给出了遍历的方法
        for (String key:future.keySet()){                        //遍历取出key,再遍历map取出value。
            System.out.println("key:"+key); 
            System.out.println(future.get(key).toString());
        }
 
        System.out.println("Entryset method");
        for (Map.Entry<String,FutureDay> pair:future.entrySet()){//遍历取出键值对,调用getkey(),getvalue()取出key和value。
             System.out.println("key:"+pair.getKey());
             System.out.println(pair.getValue().toString());
       }    
}

这里顺便一提遍历Map的两种方法keySet(),entrySet()的差别。

keySet()方法返回的是key的集合set,entrySet()返回的是键值对的集合set。虽然两者从set遍历取出元素的方法是一样的,但是根据这个元素取出value的效率有些不同。前者取出的元素是key,还要去原map中遍历取出value。
后者取出的元素是键值对,直接调用getkey(),getvalue()方法就能快速取出key和value。显然在map中存在大量键值对时,使用entrySet()来取出value的效率更高。

原文:https://blog.csdn.net/Chaosminds/article/details/49049455

### 回答1: Android移动端通过网络访问后台数据的期末大作业是基于Android平台开发一款能够连接网络并实现与后台数据交互的应用程序。该应用程序主要分为两个部分:移动端和后台服务器。 移动端部分主要涵盖了用户界面、网络访问和数据展示等功能。用户界面通过Android提供的UI组件进行设计和实现,包括各种界面元素和交互逻辑。通过网络接口访问后台数据,可以使用Android提供的HttpClient或者Volley等网络库进行网络请求和响应。获取到数据后,可以通过适配器等方式将数据展示在移动端的界面上,例如列表、网格或详情页等。 后台服务器部分主要负责处理和存储数据的业务逻辑。后台服务器可以使用Java、PHP、Python等语言搭建,选择一个适合的框架进行开发。后台服务器可以提供RESTful API接口,用于接收移动端发送的请求,处理数据查询、存储或更新等操作,并将结果返回给移动端。数据存储可以使用关系型数据库如MySQL或非关系型数据库如MongoDB。 在实现期末大作业的过程中,首先需要进行需求分析和界面设计,确定移动端应用的功能和交互逻辑。然后,搭建后台服务器,实现数据存储和处理的功能。接下来,在移动端中通过网络请求访问后台数据,并将数据展示在界面上。最后,对整个应用进行测试和优化,确保其稳定性和性能。 通过完成这个期末大作业,可以掌握Android移动开发中与后台数据交互的基本原理和方法,了解移动端与后台服务器的通信方式,同提升了分析问题、设计系统和解决实际问题的能力。 ### 回答2: Android移动端可以通过网络对后台数据进行访问,这是一种非常常见和实用的功能。在设计和实现Android移动终端的期末大作业,我们可以选择一个合适的后台数据源,并使用网络请求与后台进行交互,以获取所需的数据。 首先,我们可以选择合适的数据接口,如通过API接口或使用HTTP请求与后台进行通信。根据后台提供的接口文档或者需求分析,我们可以使用Android的网络库(如Volley、OkHttp等)来发送请求并获取返回数据。 在进行网络请求,我们需要注意网络请求的安全性和稳定性。我们可以使用 HTTPS 加密通信,确保数据在传输过程中的安全性。此外,我们还可以通过使用重试机制和错误处理来处理网络请求过程中的异常情况,如网络连接超或服务器错误等。 在获取到数据后,我们可以对数据进行解析和处理,以便在移动端进行展示。通过使用 JSON 或 XML 解析库,我们可以将返回数据转换为移动端可读取和显示的对象。然后,我们可以根据设计需求,使用适当的布局和控件将数据展示在移动端界面上,例如列表、卡片式布局等。 另外,为了提高用户体验和应用性能,我们可以将数据进行缓存,以减少请求后台数据的频率。我们可以使用缓存库,如LruCache或DiskLruCache,来将数据本地化保存,并在需要从本地获取数据。 总之,通过网络访问后台数据Android移动端开发中非常常见和重要的一部分。在期末大作业中,我们可以选择一个合适的后台数据源、使用合适的网络库进行请求和数据处理,并结合适当的布局和控件将数据展示在移动端界面上,以达到项目的设计要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值