转,JSON解析2

 JSON 使用讲解 这篇文章讲解了,JSON的介绍以及使用GSON解析。今天,我们就在Android项目中使用两种方式解析JSON数据。如果你对JSON,还不熟悉,那么请看JSON 使用讲解。

一.搭建服务以及制造JSON数据。

1.服务器选择的Tomcat,下载链接。下载安装成功后,服务启动后,在浏览器中输入'http://localhost:8080/',看到如下截图,那就说明启动成功了。

2.Tomcat服务器启动好后,找到它的安装目录‘D:\Apache Software Foundation\Tomcat 6.0\webapps’(我的安装目录是 ‘D:\Apache Software Foundation\Tomcat 6.0\webapps’),然后在该目录下,新建文件夹‘json’,在该文件夹中,创建文件‘get_data.json’,在该文件中输入JSON字符串,格式如下‘[{"id":1,"name":"zhangsan","age":30},{"id":2,"name":"lisi","age":20}]’。

3.此时在浏览器中输入‘http://localhost:8080/json/get_data.json’,如果出现如下截图,说明上面的操作是成功的。

    经过上面3步,我们就把JSON数据创建好了,接下来就是Android客户端的实现了。

二.Android客户端的实现。

1.创建Android项目。这个不用详细描述了。

2.首先记得在AndroidManifest.xml中加入网络权限。

 

[java] view plaincopy
  1. <uses-permission android:name="android.permission.INTERNET"/>  

3.网络请求实现。使用URLConnection实现的。

 

 

[java] view plaincopy
  1. public static String getData1(String urlStr) {  
  2.         String resultData = "";  
  3.         // 构造URL  
  4.         try {  
  5.             URL url = new URL(urlStr);  
  6.             // 打开连接  
  7.             URLConnection con = url.openConnection();  
  8.             con.setConnectTimeout(10 * 1000);  
  9.             con.setReadTimeout(10 * 1000);  
  10.             InputStream is = con.getInputStream();  
  11.             BufferedReader br = new BufferedReader(new InputStreamReader(is));  
  12.             String line = null;  
  13.             StringBuffer sb = new StringBuffer();  
  14.             while ((line = br.readLine()) != null) {  
  15.                 sb.append(line);  
  16.             }  
  17.             resultData=sb.toString();  
  18.             return resultData;  
  19.         } catch (MalformedURLException e) {  
  20.             // TODO Auto-generated catch block  
  21.             e.printStackTrace();  
  22.         } catch (IOException e) {  
  23.             // TODO Auto-generated catch block  
  24.             e.printStackTrace();  
  25.         }  
  26.         return null;  
  27.     }  

4.功能实现。

 

    在MainActivity中加入一个按钮,点击的时候获取网络数据,并且请求网络要在子线程中进行。有一点需要补充就是手机访问电脑时的IP地址,如果你使用手机访问电脑,IP地址还是‘localhost’,肯定是访问不了的,因为‘localhost’指的是本机,如果使用手机访问‘localhost’,那肯定是访问不到电脑的。这个IP可以有两种写法,一种是,当你使用模拟器访问的话,IP可以写成‘10.0.2.2’;另一种是,直接写为电脑在局域网内的IP地址,例如‘192.168.1.114’(我电脑的IP地址);建议直接写成电脑在局域网内的IP地址。详细实现如下代码所示,

 

[java] view plaincopy
  1. public class MainActivity extends Activity {  
  2.   
  3.     String url = "http://192.168.1.114:8080/json/get_data.json";  
  4.   
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_main);  
  9.   
  10.         findViewById(R.id.btn_getdata).setOnClickListener(  
  11.                 new OnClickListener() {  
  12.   
  13.                     @Override  
  14.                     public void onClick(View v) {  
  15.                         // TODO Auto-generated method stub  
  16.                         new MyThread().start();  
  17.                     }  
  18.                 });  
  19.     }  
  20.   
  21.     class MyThread extends Thread {  
  22.         @Override  
  23.         public void run() {  
  24.             String jsonStr = NetWorkUtils.getData1(url);  
  25.             if (!TextUtils.isEmpty(jsonStr)) {  
  26.                 Log.e("jsonStr", jsonStr);  
  27.                  parseJsonData(jsonStr);  
  28. //              parseJsonData1(jsonStr);  
  29.             }  
  30.         }  
  31.     }  
  32. }  

解析JSON采用三种方式。

 

5.使用JSONObject解析。代码很简单,就不多说了,示例如下,

 

[java] view plaincopy
  1. /** 
  2.      * 使用JSONArray和JSONObject解析 
  3.      *  
  4.      * @param jsonStr 
  5.      */  
  6.     private void parseJsonData(String jsonStr) {  
  7.         try {  
  8.             JSONArray array = new JSONArray(jsonStr);  
  9.             for (int i = 0; i < array.length(); i++) {  
  10.                 JSONObject jsonObject = array.getJSONObject(i);  
  11.                 int id = jsonObject.getInt("id");  
  12.                 String name = jsonObject.getString("name");  
  13.                 int age = jsonObject.getInt("age");  
  14.                 Person person = new Person(id, name, age);  
  15.                 Log.e("person", person.toString());  
  16.             }  
  17.         } catch (JSONException e) {  
  18.             // TODO Auto-generated catch block  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  

6.使用GSON解析。代码就更简单,示例如下,

[java] view plaincopy
  1. /** 
  2.      * 使用GSON解析 
  3.      *  
  4.      * @param jsonStr 
  5.      */  
  6.     private void parseJsonData1(String jsonStr) {  
  7.         Gson gson = new Gson();  
  8.         List<Person> list = gson.fromJson(jsonStr,  
  9.                 new TypeToken<List<Person>>() {  
  10.                 }.getType());  
  11.         for (Person person : list) {  
  12.             Log.e("person", person.toString());  
  13.         }  
  14.     }  

 

7.使用JackJson解析,做了一个JackJson工具类,代码如下:

 

[java] view plaincopy
  1. /** 
  2.  * jackjson  
  3.  */  
  4. public class JackJsonUtils {  
  5.   
  6.       
  7.     /** 
  8.      * 解析 
  9.      *  
  10.      * @param content 
  11.      * @param valueType 
  12.      * @return 
  13.      */  
  14.     public static <T> T fromJson(String content, Class<T> valueType) {  
  15.             ObjectMapper objectMapper = new ObjectMapper();  
  16.         try {  
  17.             return objectMapper.readValue(content, valueType);  
  18.         } catch (Exception e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.         return null;  
  22.     }  
  23.   
  24.     /** 
  25.      * 生成json 
  26.      *  
  27.      * @param object 
  28.      * @return 
  29.      */  
  30.     public static String toJSon(Object object) {  
  31.         ObjectMapper objectMapper = new ObjectMapper();  
  32.         try {  
  33.             return objectMapper.writeValueAsString(object);  
  34.         } catch (Exception e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.         return null;  
  38.     }  
  39. }  

调用代码,

 

 

[java] view plaincopy
  1. /** 
  2.  * jackjson解析 
  3.  *  
  4.  * @param jsonStr 
  5.  */  
  6. public void parserByJackJson(String jsonStr) {  
  7.     Person[] persons = JackJsonUtils.fromJson(jsonStr, Person[].class);  
  8.     for (Person person : persons) {  
  9.         Log.e("person", person.toString());  
  10.     }  
  11. }  

 

运行后的截图如下,

PS:也许你使用JackJson解析可能会报错,日志截图如下:

解决方法是,在你的实体类中加入无参的构造函数就完美解决了!希望能帮到你!实体类的代码如下:

 

[java] view plaincopy
  1. public class Person implements Serializable {  
  2.     /** 
  3.      *  
  4.      */  
  5.     private static final long serialVersionUID = 1L;  
  6.     private int id;  
  7.     private String name;  
  8.     private int age;  
  9.   
  10.     public Person() {  
  11.         super();  
  12.         // TODO Auto-generated constructor stub  
  13.     }  
  14.   
  15.     public Person(int id, String name, int age) {  
  16.         super();  
  17.         this.id = id;  
  18.         this.name = name;  
  19.         this.age = age;  
  20.     }  
  21.   
  22.     public int getId() {  
  23.         return id;  
  24.     }  
  25.   
  26.     public void setId(int id) {  
  27.         this.id = id;  
  28.     }  
  29.   
  30.     public String getName() {  
  31.         return name;  
  32.     }  
  33.   
  34.     public void setName(String name) {  
  35.         this.name = name;  
  36.     }  
  37.   
  38.     public int getAge() {  
  39.         return age;  
  40.     }  
  41.   
  42.     public void setAge(int age) {  
  43.         this.age = age;  
  44.     }  
  45.   
  46.     @Override  
  47.     public String toString() {  
  48.         return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";  
  49.     }  
  50.   
  51. }  

 

三.总结。

    使用了三种方式去解析JSON数据。个人建议,如果你是在Android开发,建议使用GSON,毕竟是谷歌自己的东西,使用放心,可靠!如果你是做后台服务或者接口开发,建议使用JackJson,强大、快速!相信你现在已经对JSON解析有更深入的了解了

转载于:https://www.cnblogs.com/zhanglijun/articles/8337567.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js顺序加载

2019独角兽企业重金招聘Python工程师标准>>> js想要顺序加载&#xff0c;分开js代码块&#xff0c;jsp页面在加载的时候&#xff0c;是顺序加载&#xff0c;遇到<script></script>代码块&#xff0c;先加载完成&#xff0c;然后继续往下&#xff0c;遇到…

2-05 使用固态存储SSD或PCIe卡

在大量并发的情况下&#xff0c;才能体现固态磁盘的吞吐量&#xff0c;在大并发下提供良好随机io的性能&#xff0c;这正是关系型数据库所需要的&#xff0c;相对应机械磁盘&#xff0c;固态磁盘更容易损坏&#xff08;第三点是固态磁盘的缺点&#xff09;&#xff0c;由于固态…

面试问题汇总 精选 分析 解答 职业规划 part 3

《剑指Offer——名企面试官精讲典型编程题》已经出版 非常感谢博客上的读者&#xff0c;是大家的关心、支持和鼓励让我有信心写完这本书并最终出版发行&#xff08; china-pub互动网、 亚马逊卓越网、 淘宝网、 京东网、 当当网上有售&#xff09;。网友们的鼓励让我在 博客上的…

java 分布式rpc框架_分布式RPC框架Apache Dubbo(一)

4 Dubbo快速入门Dubbo作为一个RPC框架&#xff0c;其最核心的功能就是要实现跨网络的远程调用。本小节就是要创建两个应用&#xff0c;一个作为服务的提供方&#xff0c;一个作为服务的消费方。通过Dubbo来实现服务消费方远程调用服务提供方的方法。4.1 服务提供方开发开发步骤…

轻松获知数据库事务

标题索引事务作用事务流程隔离级别实例验证事务作用事务是确保数据库系统数据的完整性的功能&#xff0c;如现在互联网行业支付业务&#xff0c;不管服务器出于什么原因异常中断&#xff0c;客户要么支付成功要么支付不成功&#xff0c;支付成功数据库金额即会发生变化&#xf…

Safari支不支持HTML5录音? 现在浏览器中最好的解决方案是WebRTC下的 navigator.getUserMedia API。...

先放结论&#xff1a;Safari支不支持HTML5录音&#xff1f; ——据我调查&#xff0c;不支持。 现在浏览器中最好的解决方案是WebRTC下的 navigator.getUserMedia API。 可是当使用Can I use查看兼容性的时候&#xff0c;我发现 不过这个是有历史原因的&#xff0c;我记得RTC是…

面试问题汇总 精选 分析 解答 职业规划 part 4

程序员做业余项目、记笔记和写博客的重要性【经典】 编程是一种创造过程&#xff0c;业余项目允许程序员在没有截止日期或各种限制的条件下&#xff0c;以探索形式编程。业余项目之所以重要&#xff0c;有以下几个原因。 探索新技术 每天都会不断有新技术出现&#xff0c;而…

NB-IOT连接移动onenet平台流程

1. 先创建账号&#xff0c;然后创建产品 2. 创建设备&#xff0c;用ATCGSN和ATCIMI查询NB-IOT的IMEI和IMSI填写上去。 3. 创建好的设备。 转载于:https://www.cnblogs.com/429512065qhq/p/8359247.html

java ejb jsp 架构_JavaEE架构

B/S 体系结构image.pngJava EE 经典架构image.pngJava EE 13规范JDBCimage.pngJDBC 对象与接口java.sql.DriverManager&#xff1a;用于管理JDBC驱动的服务类&#xff0c;当JDBC驱动加载至内存后&#xff0c;DriverManager会自动注册JDBC驱动&#xff0c;然后通过getConnection…

最大开源代码sourceforge 简介 及视音频方面常用的开源代码

所有的音视频凯源代码在这里&#xff1a;http://sourceforge.net/directory/audio-video/os:windows/&#xff0c;你可以下载分析&#xff0c;视频不懂请发邮件给我&#xff0c;帮你分析。 0.视频项目 0.1 VLC media player VLC 多媒体播放器&#xff08;最初为VideoLAN Clien…

notepad编译java_Notepad++直接编译运行java代码的具体步骤

最近不少朋友表示还不会Notepad直接编译运行java代码的操作步骤&#xff0c;使用下面小编就带来了Notepad直接编译运行java代码的操作方法哦&#xff0c;一起去看看吧。Notepad直接编译运行java代码的具体步骤下载Notepad&#xff0c;找到Plugin Manager。插件--->Plugin Ma…

基于linux 的2048

于 debian 接着写 2048, 的影响&#xff0c;如下面的&#xff1a; 感兴趣的朋友能够在这里&#xff08;http://download.csdn.net/download/kamsau/7330933&#xff09;下载。 版权声明&#xff1a;本文博客原创文章&#xff0c;博客&#xff0c;未经同意&#xff0c;不得转载。…

架构师之路

1. 架构师之路(1)---面向过程和面向对象 1、引言 机算机科学是一门应用科学&#xff0c;它的知识体系是典型的倒三角结构&#xff0c;所用的基础知识并不多&#xff0c;只是随着应用领域和方向的不同&#xff0c;产生了很多的分支&#xff0c;所以说编程并不是一件很困难的…

r语言做断轴_R语言用nls做非线性回归以及函数模型的参数估计

非线性回归是在对变量的非线性关系有一定认识前提下&#xff0c;对非线性函数的参数进行最优化的过程&#xff0c;最优化后的参数会使得模型的RSS(残差平方和)达到最小。在R语言中最为常用的非线性回归建模函数是nls&#xff0c;下面以car包中的USPop数据集为例来讲解其用法。数…

day8-异常处理与网络编程

第1章 异常处理 1.1 什么是异常? 1.1.1 描述 #1 什么是异常&#xff1f; # 异常是错误发生的信号&#xff0c;一旦程序出错&#xff0c;就会产生一个异常&#xff0c;应用程序未处理该异常&#xff0c; # 异常便会抛出&#xff0c;程序随之终止 异常就是程序运行时发生错误的信…

进程(并发,并行) join start 进程池 (同步异步)

一、背景知识 顾名思义&#xff0c;进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。进程的概念起源于操作系统&#xff0c;是操作系统最核心的概念&#xff0c;也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的…

xamarin怎么调用java的_XamarinSQLite教程在Xamarin.Android项目中使用数据库

XamarinSQLite教程在Xamarin.Android项目中使用数据库在Xamarin.Android项目中使用预设数据库的具体操作步骤如下&#xff1a;(1)创建一个Xamarin.Android项目&#xff0c;如AndroidSQLiteDemo。(2)在AndroidSQLiteDemo项目的Resources文件夹下创建一个Raw文件夹。(3)将上一节中…

服务框架及服务治理组件——业界调研

声明&#xff1a;主要内容来自公司内部 对业界的调研,不一定恰当、准确、实时。 表格文字较多&#xff0c;APP阅读体验较差 团队服务相关组件\方案通信框架监控负载均衡\路由是否开源腾讯完全自研&#xff1b;BG内部自治&#xff0c;每个BG有自己相应的解决方案&#xff0c;单独…

Swift快速入门(一)第一个Swift程序

1. 本系列说明 本系列只是一个Swift快速入门的教程&#xff0c;并没有详尽的介绍Swift&#xff0c;Swift也并不是一个简单的编程语言&#xff0c;所以要想详尽的系统的学习Swift&#xff0c;本系列并不适合你&#xff0c;此系列只是让开发者可以快速的用Swift来进行开发。另外学…

Scala学习之爬豆瓣电影

简单使用Scala和Jsoup对豆瓣电影进行爬虫&#xff0c;技术比較简单易学。写文章不易&#xff0c;欢迎大家採我的文章&#xff0c;以及给出实用的评论&#xff0c;当然大家也能够关注一下我的github&#xff1b;多谢。 1、爬虫前期准备 找好须要抓取的链接&#xff1a;https://m…