1、了解json

json就是一串字符串 只不过元素会使用特定的符号标注。
 {} 双括号表示对象
 [] 中括号表示数组
 "" 双引号内是属性或值
 : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
 所以 {"name": "Kobe"} 可以理解为是一个包含name为Kobe的对象
 而[{"name": "Michael"},{"name": "Kobe"}]就表示包含两个对象的数组

当前java的第三方json库非常多,google的gson,alibaba的fastJson,jackson,微软的也有一个,还有java自己的json ,查了下效率和受欢迎度,以后就选择马云的fastJson作为常用的json解析和构建工具了

2、了解fastJson
(1)功能强大,支持JDK的各种类型,包括基本的JavaBean、Collection、Map、Date、Enum、泛型 
(2) 无依赖,不需要例外额外的jar,能够直接跑在JDK上
(3)支持注解等等这些高级的特性还没接触到,不谈
(4)几个对比助于理解
 SerializeWriter:相当于StringBuffer
     JSONArray:相当于List<Object>
     JSONObject:相当于Map<String, Object>
(5)API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成

1 public static final Object parse(String text);                                     // 把JSON文本转换成JSONObject或者JSONArray 
2 public static final JSONObject parseObject(String text);                  // 把JSON文本转换成JSONObject 
3 public static final JSONArray parseArray(String text);                     // 把JSON文本转换成JSONArray 
4 public static final <T> T parseObject(String text, Class<T> clazz);  // 把JSON文本转换成JavaBean
5 public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本转换成JavaBean集合

6 public static final String toJSONString(Object object);                    // 将JavaBean序列化为JSON文本 
7 public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本

8 public static final Object toJson(Obiect javaObject);         //将JavaBean转换为JSONObject或者JSONArray  
 
3、解析
  首先要明白一个规律,无论传过来的jsonStr怎么组装,怎么嵌套,都逃不了以下三种,形如[]的JSONArray,形如{}的JSONObject以及“:”连接的键值对,因此解析的第一步要先判断是用parseObject还是parseArray方法(前5种),特别提醒如果直接用方法1,一般要强制转换。前提是你知道传过来的json字符串的格式。第一步解析完之后需要用到下面两类方法来调用:
 public JSONObject getJSONObject(int index);   //读取对象
 public JSONObject getJSONObject(String key);   //读取对象
 public JSONArray getJSONArray (int index);   //读取数组
 public JSONArray getJSONArray (String key);   //读取数组 
有时候需要最终取出数据,那么解析到最后一层形如{a:b,c:d,e:f} 的时候就可以直接用
JSONObject里的各种取数据的方法,比如随便说几个,getLongValue(),getString(),getInteger(),参数均为key
例:如下json字符串解析str


    {
          "id": 1
          "type": "cycle",
         "attribute": {
             "center": "(10.4, 123.345)",
             "radius": 67.4
            }
    },
    {
        "id": 2,
        "type": "polygon",
        "attribute": [
            {
             "vertex": "(10.4,133.345)"
            },
             {
            "vertex": "(10.4,143.345)"
            }
        ]
    }

现在我要得到最后的 "vertex": "(10.4,143.345)"这条数据
首先,最外层是数组
 JSONArray ja = JSON.parseArray(str);
ja这个json数组内部是两个对象,取出第二个(id为2的那个对象)
JSONObject jo = ja.getJSONObject(1) ;
jo这个json对象中有3个键值对,取出第三个,key为attribute的那个,取出后结果为数组,so
JSONArray ja1 = jo.getJSONObject("attribute");
ja1这个json数组内部有两个对象,取出第二个
JSONObject jo1 = ja1.getJSONObject(1) ;
jo1就是 {"vertex": "(10.4,143.345)"}这个对象,现在里面就1个键值对了,取出来就是了
String s = jo1.getString("vertex");
System.out.println(s);//结果为(10.4,143.345)

这个是最基本的取值,其他的还有遍历,用javaBean的暂时没碰到,暂时也不去总结,至于构建,一般都是从list,map转化,或者是在前台js中,比如我的上一篇的ztree打包的数据,我就用js的 JSON.stringify(dataList)来打包成json格式的传到后台的

接下来还有java 中list,map,和json之间的转换

第六篇:fastJson常用方法总结的更多相关文章

  1. 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)

    解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...

  2. 解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)

    解剖SQLSERVER 第六篇  对OrcaMDF的系统测试里避免regressions (译) http://improve.dk/avoiding-regressions-in-orcamdf-b ...

  3. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  4. 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单

    我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...

  5. RabbitMQ学习总结 第六篇:Topic类型的exchange

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  6. 第六篇 Replication:合并复制-发布

    本篇文章是SQL Server Replication系列的第六篇,详细内容请参考原文. 合并复制,类似于事务复制,包括一个发布服务器,一个分发服务器和一个或多个订阅服务器.每一个发布服务器上可以定义 ...

  7. 第六篇 Integration Services:初级工作流管理

    本篇文章是Integration Services系列的第六篇,详细内容请参考原文. 简介在前几篇文章中,我们关注使用增量加载方式加载数据.在本篇文章,我们将关注使用优先约束管理SSIS控制流中的工作 ...

  8. 第六篇 SQL Server安全执行上下文和代码签名

    本篇文章是SQL Server安全系列的第六篇,详细内容请参考原文. SQL Server决定主体是否有必要的执行代码权限的根本途径是其执行上下文规则.这一切都可能复杂一个主体有执行代码的权限,但是却 ...

  9. 第六篇 SQL Server代理深入作业步骤工作流

    本篇文章是SQL Server代理系列的第六篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.每个作业步骤在技术 ...

  10. Python之路【第六篇】:socket

    Python之路[第六篇]:socket   Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字&quo ...

随机推荐

  1. 继承中的隐藏(hide)重写(Override)和多态(Polymorphism)

    继承中的隐藏:(不要使用隐藏,语法没有错误但是开发项目时会被视为错误) 在继承类中完全保留基类中的函数名 //基类,交通工具 class Vehicle { public void Run() { C ...

  2. delphi Treeview用法

    Treeview用于显示按照树形结构进行组织的数据.         Treeview控件中一个树形图由节点(TreeNode)和连接线组成.TtreeNode是TTreeview的基本组成单元.   ...

  3. js条件语句,用if...else if....else方程ax2+bx+c=0一元二次方程。求根

    if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if...else if... ...

  4. linux中hadoop组件启动日志存放问题

    如果是nohup xxxx &的话会在当前目录下生成一个nohup文件存放当前出现所有的日志,&表示后台启动: 当然你也可以将日志存放在>/dev/null表示当前日志存放的位置 ...

  5. LUOGU P1501 [国家集训队]Tree II (lct)

    传送门 解题思路 \(lct\),比较模板的一道题,路径加和乘的维护标记与线段树\(2\)差不多,然后剩下就没啥了.但调了我将近一下午.. 代码 #include<iostream> #i ...

  6. NXOpenC#_Training_blockstyler(cn)【转载】

  7. github如何用浏览器直接打开项目里的html页面?

    very easy 第一步 点击html页面 第二步,在地址栏前加 htmlpreview.github.io/?就可以访问

  8. NSDateFormatter 今年日期格式化成字符串是明年日期问题?

    在项目里我要是把NSDate格式化成字符串 我的format是@"YYYY年MM月dd日 HH:mm" 传入日期2013-12-30 15:00:00后,返回给我的字符串是 201 ...

  9. 8.RabbitMQ 消息传递Java对象

    通过消息服务器传递Java对象,Java类必须实现序列化接口,可以把Java对象转化为字节数组,从消费者或生产者传递到另外一个JVM中,一定需要两个JVM共享这个类,比如是UserInfo类.   1 ...

  10. LeetCode 707. Design Linked List (设计链表)

    题目标签:Linked List 题目让我们自己设计一个 linked list,可以是单向和双向的.这里选的是单向,题目并不是很难,但要考虑到所有的情况,具体看code. Java Solution ...