7

JSON用法汇总_JSON在各种语言中的运用

 2 years ago
source link: https://www.fly63.com/article/detial/11249
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度,下面介绍JSON在各种语言中的运用。

Javascrip操作json方法

var str1 = '{ "name": "cxh", "sex": "man" }';

var data=eval("("+str1+")");//转换为json对象//data =(new

alert (data.name);//会显示出cxh

不过eval解析json有安全隐患!

现在大多数浏览器(IE8及以上,Chrome和Firefox差不多全部)自带原生JSON对象,提供JSON.parse()方法解析JSON,提供JSON.stringify()方法生成JSON,请使用这两个方法!

如果担心parse()对对象抛异常,可以加一个封装函数

JSON.pParse = function( tar ) {

    if( typeof( tar ) === 'string' ) {

        return JSON.parse( tar );

    } else {

        return tar;

    }

};

json.js操作json方法

为了方便地处理JSON数据,JSON提供了json.js包,下载地址:http://lib.sinaapp.com/js/json2/json2.js

在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键。例如:

JSON字符串:

var str1 = '{ "name": "cxh", "sex": "man" }';

JSON对象:

var str2 = { "name": "cxh", "sex": "man" };

一、JSON字符串转换为JSON对象

要运用上面的str1,必须运用下面的要领先转化为JSON对象:

//由JSON字符串转换为JSON对象
var obj = eval('(' + str + ')');
var obj = str.parseJSON(); //由JSON字符串转换为JSON对象
var obj = JSON.parse(str); //由JSON字符串转换为JSON对象

然后,就可以这样读取:

Alert(obj.name);
Alert(obj.sex);

特别留心:如果obj本来就是一个JSON对象,那么运用 eval()函数转换后(哪怕是多次转换)还是JSON对象,但是运用 parseJSON()函数处理后会有疑问(抛出语法异常)。

二、可以运用 toJSONString()或者全局要领 JSON.stringify()将JSON对象转化为JSON字符串。

var last=obj.toJSONString(); //将JSON对象转化为JSON字符
var last=JSON.stringify(obj); //将JSON对象转化为JSON字符
alert(last);

注意:上面的多个要领中,除了eval()函数是js自带的之外,其他的多个要领都来自json.js包。新版本的 JSON 修改了 api,将 JSON.stringify() 和 JSON.parse() 两个要领都注入到了 Javascript 的内建对象里面,前者变成了 Object.toJSONString(),而后者变成了 String.parseJSON()。如果提示找不到toJSONString()和parseJSON()要领,则说明您的json包版本太低。

jquery获取json方法

jQuery.getJSON(url,data,success(data,status,xhr))
参数描述url必需。规定将请求发送的哪个 URL。data可选。规定连同请求发送到服务器的数据。success(data,status,xhr)

可选。规定当请求成功时运行的函数。

额外的参数:

response - 包含来自请求的结果数据

status - 包含请求的状态

xhr - 包含 XMLHttpRequest 对象

$.getJSON("test.js", function(json){ alert("JSON Data: " + json.users[3].name); });

Java操作json方法

这个需要json-lib.jar包支持 该jar下载地址:点击下载

//JSON对象 JSONObject的使用
String str1 = "{ 'name': 'cxh', 'sex': '1' }";
JSONObject obj = JSONObject.fromObject(str1);
String name = obj.getString("name"); //直接返回字符串型 cxh
Object nameo = obj.get("name"); //直接返回对象型的cxh
int age = obj.getInt("sex"); //直接返回int型的sex

//JSON数组对象 JSONArray的运用
String jsonArrStr = "[{ 'name': 'cxh', 'sex': '1','website':'http://www.ab173.com' },{ 'name': '三少', 'sex': '1','website':'http://www.ab173.com' }]";
JSONArray array = JSONArray.fromObject(jsonArrStr);
int size = array.size(); //获取JSON数组大小
JSONObject jo = array.getJSONObject(0);//取第一个JSON对象
for(int i=0;i<size;i++){
     JSONObject jo1 = array.getJSONObject(i);
     System.out.println(jo1.getString("website")); //循环返回网址
}

//序列化Bean对象为JSON对象
User user = new User();
user.setName("cxh");
user.setSex(1);
user.setWebsite("http://www.ab173.com");
JSONObject jo2 =  JSONObject.fromObject(user);
System.out.println(jo2.toString()); //则会输出 { 'name': 'cxh', 'sex': '1','website':'http://www.ab173.com' }

php

一、json_encode()

该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:

$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo json_encode($arr);
{"a":1,"b":2,"c":3,"d":4,"e":5}

再看一个对象转换的例子:

$obj->body = 'another post';
$obj->id = 21;
$obj->approved = true;
$obj->favorite_count = 1;
$obj->status = NULL;
echo json_encode($obj);
{
 "body":"another post",
"id":21,
"approved":true,
"favorite_count":1,
"status":null
}

由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。

二、索引数组和关联数组

PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。

由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。

比如,现在有一个索引数组

$arr = Array('one', 'two', 'three');
echo json_encode($arr);
["one","two","three"]

如果将它改为关联数组:

$arr = Array('1'=>'one', '2'=>'two', '3'=>'three');
echo json_encode($arr);

结果就变了:

{"1":"one","2":"two","3":"three"}

注意,数据格式从"[]"(数组)变成了"{}"(对象)。

如果你需要将"索引数组"强制转化成"对象",可以这样写

json_encode( (object)$arr );
json_encode ( $arr, JSON_FORCE_OBJECT );

三、类(class)的转换

下面是一个PHP的类:

class Foo {
const ERROR_CODE = '404';
public $public_ex = 'this is public';
private $private_ex = 'this is private!';
protected $protected_ex = 'this should be protected';
public function getErrorCode() {
return self::ERROR_CODE;
}
}

现在,对这个类的实例进行json转换:

$foo = new Foo;
$foo_json = json_encode($foo);
echo $foo_json;

输出结果是

{"public_ex":"this is public"}

可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。

四、json_decode()

该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:

$json = '{"foo": 12345}';
$obj = json_decode($json);
print $obj->{'foo'}; // 12345

通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));

结果就是生成一个PHP对象:

object(stdClass)#1 (5) {
["a"] => int(1)
  ["b"] => int(2)
  ["c"] => int(3)
  ["d"] => int(4)
  ["e"] => int(5)
}

如果想要强制生成PHP关联数组,json_decode()需要加一个参数true:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json,true));

结果就生成了一个关联数组:

array(5) {
["a"] => int(1)
 ["b"] => int(2)
 ["c"] => int(3)
 ["d"] => int(4)
 ["e"] => int(5)
}

五、json_decode()的常见错误

下面三种json写法都是错的,你能看出错在哪里吗?

$bad_json = "{ 'bar': 'baz' }";
$bad_json = '{ bar: "baz" }';
$bad_json = '{ "bar": "baz", }';

对这三个字符串执行json_decode()都将返回null,并且报错。

第一个的错误是,json的分隔符(delimiter)只允许使用双引号,不能使用单引号。第二个的错误是,json名值对的"名"(冒号左边的部分),任何情况下都必须使用双引号。第三个的错误是,最后一个值之后不能添加逗号(trailing comma)。

另外,json只能用来表示对象(object)和数组(array),如果对一个字符串或数值使用json_decode(),将会返回null。

var_dump(json_decode("Hello World")); //null

Python

import json

str1 = '{ "name": "cxh", "sex": "1" }'
# 或者
# str1 = """{ "name": "cxh", "sex": "1" }"""
# 或者
# str1 = "{ \"name\": \"cxh\", \"sex\": \"1\" }"

obj = json.loads(str1)
print(obj["name"])
print(obj["sex"])

# 由于出现中文,记得文件头加入 # coding:utf8
json_arr_str = """[{ "name": "cxh", "sex": "1","website":"http://www.ab173.com" },{ "name": "我的", "sex": "1","website":"http://www.ab173.com" }]"""

arr = json.loads(json_arr_str)

for o in arr:
    print(o["name"])
    print(o["sex"])
    print(o["website"])
			
需要的dll:Newtonsoft.Json.dll,dll官网下载
//读取简单的json
string json="{\"username\":\"张三\"}";
string username = string.Empty;
JObject jObj=JObject.Parse(json); //进行格式化
username = jObj["username"].ToString();
Console.WriteLine(username);


//读取嵌套对象的json
json = "{\"username\":\"张三\",data:{\"address\":\"福建厦门\"}}";
jObj = JObject.Parse(json);
string address = string.Empty;
address = jObj["data"]["address"].ToString();
Console.WriteLine(address);

//读取数组,操作方式与数组类似
json = "{\"username\":\"张三\",data:[{\"address\":\"福建厦门\"},{\"address\":\"福建福州\"}]}";
jObj = JObject.Parse(json);
 address = string.Empty;
address = jObj["data"][0]["address"].ToString()+","+ jObj["data"][1]["address"].ToString();
Console.WriteLine(address);

Console.ReadLine();				

Objective-C

//JSON字符串转字典:
NSString *str1 = @"{\"name\":\"cxh\",\"sex\":\"1\"}";
NSData *jsonData1 = [str1 dataUsingEncoding:NSUTF8StringEncoding];
NSError *error1;
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData1 options:NSJSONReadingMutableContainers error:&error1];
/*
 NSJSONReadingMutableContainers 创建结果为可变数组/字典
 NSJSONReadingMutableLeaves 创建结果中字符串是可变字符串
 NSJSONReadingAllowFragments 允许json最外层不是数组或字典
 */
if (!error1) {
	NSLog(@"jsonDic is:%@",jsonDic);
}
else{
	NSLog(@"error:%@",error1);
}

//字典转JSON字符串
NSError *error2 = nil;
NSData *jsonData2 = [NSJSONSerialization dataWithJSONObject:jsonDic options:NSJSONWritingPrettyPrinted error:&error2];
if (!error2) {
	NSString *str2 = [[NSString alloc] initWithData:jsonData2 encoding:NSUTF8StringEncoding];
	NSLog(@"json string is:%@",str2);
}
else{
	NSLog(@"error:%@",error2);
}
				

链接: https://www.fly63.com/article/detial/11249


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK