喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

【村长请吃饭啊】 ---北京诚聘--- 【你还在犹豫吗?】

上一主题 下一主题
 14  1/2  1  2  > 
     
标题: PHP & Javascript 之 XML的代替者JSON  
 
longbill
注册会员
Rank: 2



UID 69845
精华 0
积分 116
帖子 82
金钱 116 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-3-18
状态 离线
PHP & Javascript 之 XML的代替者JSON

我个人觉得PHP与Javascript各有长处,如果能完美的结合起来,那将创造出许许多多的奇迹! 我是初次写此类文章,Bug难免,请各位指正~
    现在AJAX应用非常流行,而在AJAX中客户端Javascript和服务端动态脚本的通信是关键。如果传输的信息比较简单,通常我们会直接采用字符串的方式,如果信息结构复杂一点,则通常用XML文档。XML文档虽然应用广泛,但是用php生成和用Javascript处理却不是一件很容易的事情。这里我推荐一种XML文档的比较好简化替代方案:JSON!
    首先我们来了解一下Javascript的基础知识。
    1.创建数组,可以用JS内建的类Array来初始化,也可以用JSON符号"[]"。下面通过两种方式创建的arr1和arr2的实质是一样的:

var arr1 = new Array();
arr1[0] = "apple";
arr1[1] = "google";
arr1[2] = "longbill";

var arr2 = ["apple","google","longbill"];
注意,数组的索引也可以是字符串,如 arr1["name"] = "longbill"; 这时的数组就相当于对象了。。。
    2.创建对象,可以用JS内建的类Object来初始化,也可以用JSON符号"{}"。下面通过两种方式创建的obj1和ob2的实质也是一样的:

var obj1 = new Object();
obj1.name = "longbill";
obj1.age = 18;

var obj2 = { name:"longbill",age:18 };
注意,这里"{"和"}"之间必须写成"键:值"的形式,而且不同的"键:值"之间要用","分割。 "键"中也可以包含空格等特殊字符,此时要用""(引号)来引用,如 "phone number":123456
    其实在JS中,数组的本质是一个对象,对象本身也是一个数组。所以, obj1.name 和 obj1["name"] 是同一个引用。
    我们还可以通过JSON符号的嵌套来定义复杂的S对象:

var people = [
    {
        name:"longbill",
        age:18
    },
    {
        name:"neal",
        age:19
    },
    {
        name:"glocklee",
        age:17
    }
];
//这个应该看的懂吧~~
大部分XML文档都可以用JSON来表达:

<?xml version="1.0"?>
<root>
  <book>
    <name>Ju love</name>
    <price>$15</price>
  </book>
  <book>
    <name>Javascrip</name>
    <price>$25</price>
  </book>
</root>
如果用JSON就可以表达为:

[
  {
     name:"Ju love",
     price:"$15"
  },
  {
     name:"Javascript",
     price:"$25"
  }
]
是不是简化很多?

    而且客户端JS处理起来也很简单,只要用执行字符串函数 "eval" 就可以将JSON信息提取出来,而如果是XML文档,那就不的不用大量的标准DOM操作来提取其中的数据。如:

//已经用AJAX从服务端下载了一个JSON文件(字符串),保存在变量 json 里
eval("var myvar = "+json);
//这样,JSON里的信息就表达在myvar这个变量里了。
缺点:一旦JSON的格式错误,将导致服务端JS系统错误,甚至崩溃。
   解决办法
   最好在eval之前使用try(试探执行),如

//已经用AJAX从服务端下载了一个JSON文件(字符串),保存在变量 json 里
try {
    eval("var myvar = "+json);
} catch(e) { alert('json syntax error!'); }
//这样,即使JSON格式错误,也只会弹出一个提示框,而不会抛出一个脚本错误!
[ 本帖最后由 longbill 于 2006-8-14 11:48 AM 编辑 ]




PHPCMS文件管理器
2006-8-14 11:46 AM#1
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
coolhpy
注册会员
Rank: 2



UID 70642
精华 0
积分 141
帖子 128
金钱 141 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-3-29
来自 浙江
状态 离线
[推荐阅读] 使用linux做服务器收费的问题
噢,网上看到过类似的介绍,这样是比去解晰XML要方便很多。
2006-8-14 02:59 PM#2
查看资料  访问主页  Blog  发短消息  顶部
 
crazysoul
注册会员
Rank: 2
一般会员



UID 64747
精华 0
积分 72
帖子 94
金钱 72 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2005-6-15
状态 离线
[推荐阅读] 深海再度寻找PHP软件开发外包业务


QUOTE:
其实在JS中,数组的本质是一个对象,对象本身也是一个数组
在JS中,数组的确是由对象构造而成,可以用typeof a[]来测试(JS数据类型中没有array这一型).但不能说"对象本身也是一个数组",难道说父母生了你,你也是你的父母? Array所具有的方法,原生的Object并不具有.
另外

QUOTE:
[
  {
     name:"Ju love",
     price:"$15"
  },
  {
     name:"Javascript",
     price:"$25"
  }
]
应该是:
var root =
{
book:
[
  {
     name:"Ju love",
     price:"$15"
  },
  {
     name:"Javascript",
     price:"$25"
  }
]
};

[ 本帖最后由 crazysoul 于 2006-8-15 01:19 AM 编辑 ]
2006-8-15 01:02 AM#3
查看资料  发短消息  顶部
 
longbill
注册会员
Rank: 2



UID 69845
精华 0
积分 116
帖子 82
金钱 116 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-3-18
状态 离线
[推荐阅读] VS.Php IDE for Visual Studio 2005
呵呵,楼上批评的是啊~~



PHPCMS文件管理器
2006-8-15 10:42 AM#4
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
菜鸟也要有理想
中级会员
Rank: 3Rank: 3
一般会员



UID 65342
精华 0
积分 439
帖子 426
金钱 439 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2005-8-1
状态 离线
[推荐阅读] 快要让我崩溃的一个我问题。。求求高后们过来看看
仔细看一下很多门户都这么搞的。。
2006-8-17 09:10 AM#5
查看资料  发短消息  顶部
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 2487
帖子 4632
金钱 2484 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
[推荐阅读] 请教各位在PHP中动态返回上一页这个代码是怎么用的
今天刚从书里看到这部分内容 很有用



最近写的一些代码都会在以下地址发布,有兴趣的来批:
http://www.phpx.com/happy/thread-131368-1-1.html
2006-8-17 05:23 PM#6
查看资料  Blog  发短消息  顶部
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 2487
帖子 4632
金钱 2484 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
[推荐阅读] 谁有php版的 html转ubb代码
对了 JSON的字符串应该都需要addslashes函数处理一下吧?



最近写的一些代码都会在以下地址发布,有兴趣的来批:
http://www.phpx.com/happy/thread-131368-1-1.html
2006-8-18 10:33 AM#7
查看资料  Blog  发短消息  顶部
 
longbill
注册会员
Rank: 2



UID 69845
精华 0
积分 116
帖子 82
金钱 116 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-3-18
状态 离线
[推荐阅读] 数据非 Discuz! 分卷备份格式用什么转换工具转换


QUOTE:
sanders_yao

  发表于 2006-8-18 10:33 AM
对了 JSON的字符串应该都需要addslashes函数处理一下吧?
是啊,不然如果字符串里有引号会出错的




PHPCMS文件管理器
2006-8-18 10:42 AM#8
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 2487
帖子 4632
金钱 2484 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
[推荐阅读] 在PHP分页中,我用if判断当前页面,网页会无法显示
刚才测试的时候出现了一个问题 希望大家解决一下
我建立了一个文件内容如下:
{
        "item"        : [
                {
                        "title"                : encodeURIComponent("往事如烟(我第一次“谈朋友”)"),
                        "link"                : "http://www.chinalabs.com/view/xueshu/135550.html",
                        "author"        : "TOM科技",
                        "pubDate"        : "2006-4-13 17:07:49"
                },
                {
                        "title"                : encodeURIComponent("往事如烟(我第一次“谈朋友”)"),
                        "link"                : "http://www.chinalabs.com/view/xueshu/135550.html",
                        "author"        : "TOM科技",
                        "pubDate"        : "2006-4-13 17:07:49"
                }
        ]
}

但是我在另一个测试页面请求的时候就会出现乱码,请先看下我的代码片断:

function loader(){
        var req = getXmlHTTPRequest();
        req.open("get", "http://localhost/test.txt", false);
        req.send();
        eval("var strReq = " + req.responseText);
        var strOutput = "";
        for(var i = 0;i < strReq["item"].length;i ++){
                strOutput += "<tr><td>" + strReq["item"]["title"] + "</td></tr>";
        }
        strOutput = "<table border=\"1\">" + decodeURIComponent(strOutput) + "</talbe>";
        document.getElementById("console").innerHTML = strOutput;
        alert(strOutput);
}

window.onload = function(){
        document.getElementById("test").onclick = loader;
}
</script>
<body>
<div id="test" style="background-color:#CCCCCC; width:100px; height:100px;"></div>
<div id="console" style="width:500px; border:solid #000000 1px;"></div>
</body>
</head>
有没有使用js解决这种乱码的方法




最近写的一些代码都会在以下地址发布,有兴趣的来批:
http://www.phpx.com/happy/thread-131368-1-1.html
2006-8-18 11:58 AM#9
查看资料  Blog  发短消息  顶部
 
luzhou (luzhou)
金牌会员
Rank: 6Rank: 6
资深会员



UID 22070
精华 0
积分 1048
帖子 1037
金钱 1048 喜悦币
威望 0
人脉 0
阅读权限 70
注册 2003-7-28
状态 离线
[推荐阅读] 谁有php版的 html转ubb代码 和 有关php 正则表达式
确实是好文!



自在的PHPer~
2006-8-19 06:54 AM#10
查看资料  发短消息  顶部
 14  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.039819 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP