JSON基础学习

47 篇文章 0 订阅
19 篇文章 0 订阅

一、概念

        JSON(JavaScript Object Notation):又叫JavaScript对象表示法,不是一个文档格式,没有*.json的文档,一般JSON格式的文档存在txt中,并且规定字符集必须是UTF-8。JSON有两种数据结构:

        1、Map:也称为对象;用{....}表示。简单的说就是Java中的Map,名称-值对的形式给出,名称和值之间用“:”隔开,两个Map之间用“,”隔开,一般表示形式如下:{'key1':'value1','key2':'value2'}

        2、Array:也称为数组;用[......]表示。就是普通意义上的数组,一般形式如下:['arr1','arr2','arr3']

        也就是说所有的JSON对象都是要以这些形式表示成字符串。JSON的数据结构只有两种:Map和Array,这两种可以互相嵌套。

二、使用

        1、Java:

        Java使用JSON需导入包:json-lib.jar,json-lib.jar包依赖以下的JAR包:commons-lang.jar、commons-beanutils.jar、commons-collections.jar、commons-logging.jar、ezmorph.jar、json-lib-2.2.2-jdk15.jar。JSON的两种数据结构类型分别对应JSONObject和JSONArray类:

                1>JSONObject:

                       ①Java对象或JSON字符串转JSON对象:

JSONObject jsonObj = JSONObject.fromObject(javaObj);

                       ②JSON对象转字符串:

String str = jsonObj.toString();

                       ③JSON对象转Java对象:

User user= (User)JSONObject.toBean(jsonObj,User.class);

                2>JSONArray:

                       ①Java数组或JSON字符串转JSON数组:

JSONArray jsonArray = JSONArray.fromObject(objList);

                       ②JSON数组转字符串:

String str = jsonArray.toString();

                       ③JSON数组转Java数组:

List<User> users= (List<User>)JSONArray.toCollection(jsonArray, User.class);

        2、JavaScript:

        JavaScript中内置了JSON,所以可以直接使用JSON:

                1>js对象转JSON字符串:JSON.stringify(value[, replacer [, space]])

var student = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\"W3C\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
var str = JSON.stringify(student);
console.log(str);

                第二个参数可对结果进行特殊处理,可以是函数,也可以是数组:

                       ①如果第二个参数是函数(第一个参数一般是数组):该函数的入参有两个,分别是key和value,会将第一个数组参数中的值逐个被第二个参数指定的函数处理,例如:

var fruit = new Array() ; 
fruit[0] = "apple"; 
fruit[1] = "pear"; 
fruit[2] = "orange"; 
var json = JSON.stringify(fruit,switchUpper); 
function switchUpper(key, value) { 
    return value.toString().toUpperCase(); 
} 
console.log(json); 

                       ②如果第二个参数是数组(第一个参数一般是对象):会以第二个数组参数中的每个值为key在第一个对象参数的key中匹配,只有找到才会返回结果,例如:

var data = {
    name:"小明",
    info:{
        age:18,
        sex:"male"
    }
};
var json = JSON.stringify(data, ["name", "info", "sex"]);
console.log(json);

                第三个参数用于设置缩进,如果不设置则无缩进。还可以设置为数字、转译字符或字符串:

                       ①如果第三个参数是数字N:表示缩进N个字符,N不能超过10,否则按10处理,例如:

var student = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\"W3C\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
var str = JSON.stringify(student,null,20);
console.log(str);

                       ②如果第三个参数是转译字符:比如是\t,则表示缩进为一个Tab(通常为4个字符),例如:

var student = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\"W3C\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
var str = JSON.stringify(student,null,'\t');
console.log(str);

                       ③如果第三个参数是字符串:表示缩进的部分由该字符串代替(字符串长度不能超过10),例如:

var student = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\"W3C\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
var str = JSON.stringify(student,null,'#########');
console.log(str);

       特殊地:非数组对象中的undefined、任意函数以及 symbol值,在序列化成JSON字符串过程中会被忽略;数组对象中的undefined、任意函数以及 symbol值,在序列化成JSON字符串过程中会转化成null,例如:

var obj = {"undefined":undefined,"func":function(){},"symbol":Symbol("")};
JSON.stringify(obj); //"{}"

var arr = [undefined,Symbol(""),function(){}];
JSON.stringify(arr); //[null,null,null]

                2>JSON字符串转js对象:JSON.parse(str),有的浏览器不支持可以使用jQuery的jQuery.parseJSON(str)

var str = '{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}';
var obj = JSON.parse(str);
console.log(obj);

       注意:JSON字符串中的Key或Value如果是用""引号括起来的,如果其内部需用引号,则只能用单引号,即如果出现多层引号,需使用单引号双引号交替的方案,否则会报错。

        3、php:

                1>php对象转JSON字符串:json_encode($var,$option,$depth) 

                有一种特殊情况需要注意:对于一个含多个对象的数组,如果各个对象的key是从0开始连续的整数,则经过json_encode()处理之后得到的结果是一个数组字符串

<?php
    $arr = [0=>"apple", 1=>"pear", 2=>"banana", 3=>"orange", 4=>"peach", 5=>"melon"];
    echo json_encode($arr);//["apple","pear","banana","orange","peach","melon"]
?>

                如果各个对象的key不是从0开始且不是连续的整数,那么经过json_encode()处理之后得到的结果是一个对象字符串

<?php
    $arr = [1=>"apple", 2=>"pear", 3=>"banana", 4=>"orange", 5=>"peach", 6=>"melon"];
    echo json_encode($arr);//{"1":"apple","2":"pear","3":"banana","4":"orange","5":"peach","6":"melon"}

    $arr = [0=>"apple", 1=>"pear", 2=>"banana", 4=>"orange", 5=>"peach", 6=>"melon"];
    echo json_encode($arr);//{"0":"apple","1":"pear","2":"banana","4":"orange","5":"peach","6":"melon"}
?>

                所以如果使用了unset()之后,注意一定要使用array_values()将不连续的key重新生成为从0开始连续的整数才能保持返回的结果是数组字符串。

                2>JSON字符串转php对象:json_decode($str,$assoc)

                       ①如果$str为对象字符串,$assoc为true,则转为包含对象的数组

<?php
    $str = '{"1":"apple","2":"pear","3":"banana","4":"orange","5":"peach","6":"melon"}';
    $arr = json_decode($str,true);
    var_dump($arr);
?>
//array (size=6)
//  1 => string 'apple' (length=5)
//  2 => string 'pear' (length=4)
//  3 => string 'banana' (length=6)
//  4 => string 'orange' (length=6)
//  5 => string 'peach' (length=5)
//  6 => string 'melon' (length=5)

                       ②如果$str为对象字符串,$assoc为false,则转为php原生对象

<?php
    $str = '{"1":"apple","2":"pear","3":"banana","4":"orange","5":"peach","6":"melon"}';
    $arr = json_decode($str,false);
    var_dump($arr);
?>
//object(stdClass)[1]
//  public '1' => string 'apple' (length=5)
//  public '2' => string 'pear' (length=4)
//  public '3' => string 'banana' (length=6)
//  public '4' => string 'orange' (length=6)
//  public '5' => string 'peach' (length=5)
//  public '6' => string 'melon' (length=5)

                       ③如果$str为数组字符串,$assoc为true,则转为包含数组的数组

<?php
    $str = '[{"1":"apple"},{"2":"pear"},{"3":"banana"},{"4":"orange"},{"5":"peach"},{"6":"melon"}]';
    $arr = json_decode($str,true);
    var_dump($arr);
?>
//array (size=6)
//  0 => array (size=1) 1 => string 'apple' (length=5)
//  1 => array (size=1) 2 => string 'pear' (length=4)
//  2 => array (size=1) 3 => string 'banana' (length=6)
//  3 => array (size=1) 4 => string 'orange' (length=6)
//  4 => array (size=1) 5 => string 'peach' (length=5)
//  5 => array (size=1) 6 => string 'melon' (length=5)

                       ③如果$str为数组字符串,$assoc为false,则转为包含php原生对象的数组

<?php
    $str = '[{"1":"apple"},{"2":"pear"},{"3":"banana"},{"4":"orange"},{"5":"peach"},{"6":"melon"}]';
    $arr = json_decode($str,false);
    var_dump($arr);
?>
//array (size=6)
//  0 => object(stdClass)[1] public '1' => string 'apple' (length=5)
//  1 => object(stdClass)[2] public '2' => string 'pear' (length=4)
//  2 => object(stdClass)[3] public '3' => string 'banana' (length=6)
//  3 => object(stdClass)[4] public '4' => string 'orange' (length=6)
//  4 => object(stdClass)[5] public '5' => string 'peach' (length=5)
//  5 => object(stdClass)[6] public '6' => string 'melon' (length=5)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值