Simple JSON开发指南

Simple JSON是Google开发的Java JSON解析框架,基于Apache协议。

json-simple的主页:http://www.jb51.net/softs/455885.html

下载的文件是:json_simple.jar

例子1:很方便的方式,使用JSONValue

 System.out.println("=======decode======="); 

    String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
    Object obj=JSONValue.parse(s);
    JSONArray array=(JSONArray)obj;
    System.out.println("======the 2nd element of array======");
    System.out.println(array.get(1));
    System.out.println(); 

    JSONObject obj2=(JSONObject)array.get(1);
    System.out.println("======field \"1\"==========");
    System.out.println(obj2.get("1"));  

    s="{}";
    obj=JSONValue.parse(s);
    System.out.println(obj); 

    s="[5,]";
    obj=JSONValue.parse(s);
    System.out.println(obj); 

    s="[5,,2]";
    obj=JSONValue.parse(s);
    System.out.println(obj); 

JSONObject是继承Map的,而JSONArray是继承List的,所以你可以用Map和List的标准方式来使用JSONObject和JSONArray。

而JSONValue则可以使用数组也可以用对象。

例子2:快速的方式,使用JSONParser

 JSONParser parser=new JSONParser(); 

  System.out.println("=======decode======="); 

  String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
  Object obj=parser.parse(s);
  JSONArray array=(JSONArray)obj;
  System.out.println("======the 2nd element of array======");
  System.out.println(array.get(1));
  System.out.println(); 

  JSONObject obj2=(JSONObject)array.get(1);
  System.out.println("======field \"1\"==========");
  System.out.println(obj2.get("1"));  

  s="{}";
  obj=parser.parse(s);
  System.out.println(obj); 

  s="[5,]";
  obj=parser.parse(s);
  System.out.println(obj); 

  s="[5,,2]";
  obj=parser.parse(s);
  System.out.println(obj); 

使用JSONParser需要捕获异常。

例子3:异常处理

 String jsonText = "[[null, 123.45, \"a\\tb c\"]}, true";
  JSONParser parser = new JSONParser(); 

  try{
  parser.parse(jsonText);
  }
  catch(ParseException pe){
  System.out.println("position: " + pe.getPosition());
  System.out.println(pe);
  } 

执行结果:

position:25 Unexpected token RIGHT BRACE(}) at position 25.

例子4:容器工厂

使用使用ContainerFactory类来创建一个容器工厂。

 String jsonText = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}";
  JSONParser parser = new JSONParser();
  ContainerFactory containerFactory = new ContainerFactory(){
  public List creatArrayContainer() {
   return new LinkedList();
  } 

  public Map createObjectContainer() {
   return new LinkedHashMap();
  } 

  }; 

  try{
  Map json = (Map)parser.parse(jsonText, containerFactory);
  Iterator iter = json.entrySet().iterator();
  System.out.println("==iterate result==");
  while(iter.hasNext()){
   Map.Entry entry = (Map.Entry)iter.next();
   System.out.println(entry.getKey() + "=>" + entry.getValue());
  } 

  System.out.println("==toJSONString()==");
  System.out.println(JSONValue.toJSONString(json));
  }
  catch(ParseException pe){
  System.out.println(pe);
  } 

结果如下:

==iterate result== first=>123 second=>[4,5,6] third=>789 ==toJSONString()==
 {"first":123,"second":[4,5,6],"third":789}

如果你不使用容器工厂,Simple-JSON默认使用JSONObject和JSONArray。

 例子5:可停的SAX式内容处理

SimpleJSON推荐一种简单的可停的SAX方式的内容处理方式来处理文本流,用户可以停留在逻辑输入流的任意点,接着去处理其他逻辑,然后再继续先前的处理。不用等待整个流处理完毕。以下是一个例子。

KeyFinder.java:

 class KeyFinder implements ContentHandler{
  private Object value;
  private boolean found = false;
  private boolean end = false;
  private String key;
  private String matchKey; 

  public void setMatchKey(String matchKey){
  this.matchKey = matchKey;
  } 

  public Object getValue(){
  return value;
  } 

  public boolean isEnd(){
  return end;
  } 

  public void setFound(boolean found){
  this.found = found;
  } 

  public boolean isFound(){
  return found;
  } 

  public void startJSON() throws ParseException, IOException {
  found = false;
  end = false;
  } 

  public void endJSON() throws ParseException, IOException {
  end = true;
  } 

  public boolean primitive(Object value) throws ParseException, IOException {
  if(key != null){
   if(key.equals(matchKey)){
   found = true;
   this.value = value;
   key = null;
   return false;
   }
  }
  return true;
  } 

  public boolean startArray() throws ParseException, IOException {
  return true;
  } 

  public boolean startObject() throws ParseException, IOException {
  return true;
  } 

  public boolean startObjectEntry(String key) throws ParseException, IOException {
  this.key = key;
  return true;
  } 

  public boolean endArray() throws ParseException, IOException {
  return false;
  } 

  public boolean endObject() throws ParseException, IOException {
  return true;
  } 

  public boolean endObjectEntry() throws ParseException, IOException {
  return true;
  }
 } 

Main logic:

String jsonText ="{\"first\": 123, \"second\": [{\"k1\":{\"id\":\"id1\"}}, 4, 5, 6, {\"id\": 123}], \"third\": 789, \"id\": null}";
 JSONParser parser =newJSONParser();
 KeyFinder finder =newKeyFinder();
 finder.setMatchKey("id");
 try{
 while(!finder.isEnd()){
  parser.parse(jsonText, finder,true);
  if(finder.isFound()){
  finder.setFound(false);
  System.out.println("found id:");
  System.out.println(finder.getValue());
  }
 }
 }
 catch(ParseException pe){
 pe.printStackTrace();
 }

执行结果:

found id:
 id1
 found id:
 123
 found id:
 null

例子6:整个对象图,用SAX式的解析

 class Transformer implements ContentHandler{
   private Stack valueStack; 

   public Object getResult(){
    if(valueStack == null || valueStack.size() == 0)
     return null;
    return valueStack.peek();
   } 

   public boolean endArray () throws ParseException, IOException {
    trackBack();
    return true;
   } 

   public void endJSON () throws ParseException, IOException {} 

   public boolean endObject () throws ParseException, IOException {
    trackBack();
    return true;
   } 

   public boolean endObjectEntry () throws ParseException, IOException {
    Object value = valueStack.pop();
    Object key = valueStack.pop();
    Map parent = (Map)valueStack.peek();
    parent.put(key, value);
    return true;
   } 

   private void trackBack(){
    if(valueStack.size() > 1){
     Object value = valueStack.pop();
     Object prev = valueStack.peek();
     if(prev instanceof String){
      valueStack.push(value);
     }
    }
   } 

   private void consumeValue(Object value){
    if(valueStack.size() == 0)
     valueStack.push(value);
    else{
     Object prev = valueStack.peek();
     if(prev instanceof List){
      List array = (List)prev;
      array.add(value);
     }
     else{
      valueStack.push(value);
     }
    }
   } 

   public boolean primitive (Object value) throws ParseException, IOException {
    consumeValue(value);
    return true;
   } 

   public boolean startArray () throws ParseException, IOException {
    List array = new JSONArray();
    consumeValue(array);
    valueStack.push(array);
    return true;
   } 

   public void startJSON () throws ParseException, IOException {
    valueStack = new Stack();
   } 

   public boolean startObject () throws ParseException, IOException {
    Map object = new JSONObject();
    consumeValue(object);
    valueStack.push(object);
    return true;
   } 

   public boolean startObjectEntry (String key) throws ParseException, IOException {
    valueStack.push(key);
    return true;
   } 

  } 

Main方式逻辑:

 String jsonString = <Input JSON text>;
  Object value = null;
  JSONParser parser = new JSONParser();
  Transformer transformer = new Transformer(); 

  parser.parse(jsonString, transformer);
  value = transformer.getResult(); 

执行结果:

String jsonString =<Input JSON text>;
 Object value =null;
 JSONParser parser =newJSONParser();
 value = parser.parse(jsonString);

注意:

JSONPauser不是线程安全的。

json_encode — 对变量进行 JSON 编码。

说明:string json_encode ($value ),返回 value 值的 JSON 形式。

参数:待编码的 value ,除了resource 类型之外,可以为任何数据类型

该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)

返回值:编码成功则返回一个以 JSON 形式表示的 string 。

(0)

相关推荐

  • Json_encode防止汉字转义成unicode的方法

    大家都知道,json_encode通常会把json中的汉字转义成unicode,但是这并不一定是我们想要的.有时候,我们需要获得汉字形式的json字符串,比如需要获得gbk编码的json字符串(只要把汉字形式的字符串转码就可以得到了).有什么好办法么? php官方听到了这个需求,并提供了一种可靠的解决方案:JSON_UNESCAPED_UNICODE.这个参数可以保证json_encode不再将汉字转为unicode. 似乎这样就解决了?当我们高高兴兴的用这个参数的时候,发现并没有什么卵用.仔细

  • java解析php函数json_encode unicode 编码问题

    android开发中在和服务器端接口对接时出现编码问题,从服务器端获取到的数据是 "\u8bbe\u59071ID-\u8bbe\u59071\u540d\u79f0;\u8bbe\u59073id-\u8bbe\u59073\u540d\u79f0;\u8bbe\u59077id-\u8bbe\u59077\u540d\u79f0" 接口是通过php函数中json_encode进行编码后返回的,在客户端通过java.net.URLdecoder.decode()解码不管用,但是直接将

  • PHP json_encode() 函数详解及中文乱码问题

    在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它. 这个函数的功能是将数值转换成json数据存储格式. <?php $arr = array ( 'Name'=>'希亚', 'Age'=> ); $jsonencode = json_encode($arr); echo $jsonencode; ?> 程序运行结果如下: {"Name":null,"Age&

  • 浅谈json_encode用法

    1.从数据库中查询出来的数据,放在数组中 复制代码 代码如下: $query=mysql_query($SQL);  while($row = mysql_fetch_array($query)){         $xdata[]=$row['EventDate'];          $ydata[]=intval($row['data']);     } 2.将数据转成json 复制代码 代码如下: $data_arr=array($xdata,$ydata)   json_encode(

  • Simple JSON开发指南

    Simple JSON是Google开发的Java JSON解析框架,基于Apache协议. json-simple的主页:http://www.jb51.net/softs/455885.html 下载的文件是:json_simple.jar 例子1:很方便的方式,使用JSONValue System.out.println("=======decode======="); String s="[0,{\"1\":{\"2\":{\&

  • 微信小程序 开发指南详解

    编写代码 创建小程序实例 点击开发者工具左侧导航的"编辑",我们可以看到这个项目,已经初始化并包含了一些简单的代码文件.最关键也是必不可少的,是 app.js.app.json.app.wxss 这三个.其中,.js后缀的是脚本文件,.json后缀的文件是配置文件,.wxss后缀的是样式表文件.微信小程序会读取这些文件,并生成小程序实例. 下面我们简单了解这三个文件的功能,方便修改以及从头开发自己的微信小程序. ​ app.js是小程序的脚本代码.我们可以在这个文件中监听并处理小程序的

  • Vue开发指南之重点知识梳理

    概述 如果您是Vue开发的新手,您可能已经听过很多关于它的专业术语了,例如:单页面应用程序.异步组件.服务器端呈现等. 另外您可能还经常听到和Vue一起提到的工具和库,如Vuex.Webpack.Vue CLI和Nuxt. 也许您在面对这些未知的术语和工具时会感到无助和绝望,没关系,您并不孤单,因为这是所有新手在初次接触Vue时都会有的感受. 但如果您试图要一次掌握所有这些内容,那么这些庞大的体系很可能会压垮你.为此,我在这里将为大家展示一个"知识图表",它包含了所有在专业Vue开发过

  • 小程序开发指南之全局配置

    目录 全局配置文件及常用的配置项 window 小程序窗口的组成部分 window 常用配置项 设置导航栏的标题 设置导航栏的背景色 设置导航栏标题颜色 全局开启下拉刷新(在 app.json 中启用下拉刷新功能,会作用于每个小程序页面) 设置下拉刷新时窗口的背景色 设置下拉刷新时 loading 的样式 设置上拉触底的距离 tabBar 什么是tabBar tabBar 的 6 个部分 tabBar 常用配置项 页面配置文件 页面配置文件的作用 页面配置和全局配置的关系 页面配置中常用的配置项

  • 详解Anyscript开发指南绕过typescript类型检查

    目录 前言 场景设定 解决方法 注释忽略 场景用例 类型断言 场景用例 泛型转换 场景用例 总结 前言 随着越来越多的前端项目采用 typescript 来开发,越来越多前端开发者会接触.使用这门语言.它是前端项目工程化的一个重要帮手,结合 vscode 编辑器,给予了前端开发者更严谨.高效的编码体验.但同时,严格的类型检查也会使部分开发者的编码效率有所降低,将时间花费在解决类型冲突.类型不匹配上,从而导致望而却步,迟迟不敢上手. 本文描述了几种绕过 typescript 类型检查的方法,帮助t

  • 微信小程序开发指南之图片压缩解决方案

    目录 前言: 问题:现有的压缩方案支付宝小程序不生效 解决方案: 核心代码展示: 附:微信小程序图片压缩(支持多张图) 小结: 前言: 由于公司业务拓展,急需基于uniapp生成支付宝小程序.之前已经成功将微信小程序和H5融合成一套码,故得知此需求的时候,笔者信心十足,但是本着实践出真知的想法,觉得还是得先调研一下uniapp在支付宝小程序的兼容性,并集成已有项目主体关键功能,为后续的技术调研方案做准备.在调研过程中,发现之前封装好的图片压缩方法在支付宝小程序上无法正常使用,重新阅读了官方文档后

  • AngularJS 中的指令实践开发指南(一)

    指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令.这篇教程会为你讲述如何自定义指令,以及介绍如何在实际项目中使用.在这篇文章的最后(第二部分),我会指导你如何使用Angular指令来创建一个简单的记事本应用. 概述 一个指令用来引入新的HTML语法.指令是DOM元素上的标记,使元素拥有特定的行为.举例来说,静态的HTML不知道如何来创建和展现一个日期选择器控件.让HTML能识别这个语法,我们需要

  • node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作

    Node.js是一套用来编写高性能网络服务器的JavaScript工具包   通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来介绍下如何通过NodeJS来操作 MySQL 数据库. 安装MySQL模块到NodeJS中 我们需要让NodeJS支持MySQL,则需要将MySQL模块添加到系统支持库   想要快速了解Node.js ,赞生推荐亲看看 node.js_guide.pdf  - node.js 开发指南 :想要电

  • PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解

    PHP导出EXCEL快速开发指南phpexcel有专有的开发文档,详细操作请参考其开发文档,本文档只是对其在使用上作了优化整合,便于在新项目中快速开发.phpexcel生成文件同样有两种方式,一种方式为直接输出,一种方式为生成静态文件.直接输出:主文件为(class目录的同目录文件): 复制代码 代码如下: <?php include("./class/class.php"); // 包含class的基本头文件include("./class/phpexcel/PHPE

  • 前端开发指南之vue-grid-layout的使用实例

    目录 前言 效果图 一.vue中简单案例 1.安装组件 NPM 2.vue文件 二.vue3使用(vue文件) 1.需要导入vue3支持的该版本插件 2.在mian.js里引入: 三.在IE上无法打开,并报错缺少: 总结 前言 Vue Grid Layout官方文档 Vue Grid Layout中文文档 可通过拖拽改变布局(如果我们做简易开发,通过拖拽组件形成页面或者有这个需求就是非常实用的了) 因为vue-grid-layout是vue2版本的 但自己用的是vue3版本,所以要安装vue3的

随机推荐