在Unity3D⾥使⽤JSON格式进⾏数据交换
这个例⼦⾥做的事情很简单,主要做了两件事:
1 从服务器的php程序⾥读⼀个json数据,然后把内容显⽰出来。
2 把⼀个数据结构转换为JSON传给服务器。
所谓数据交换,⼀来⼀回,这个例⼦都做了。
⾸先第⼀个,写⼀个最简单的php程序⽣成json数据。
取名叫test.php
Java代码
1. <?php
2. $arr=array(
3.    'username' => 'foo',
4.    'password' => 'bar'
5. );
6. echo json_encode($arr);
7. ?>
<?php
$arr=array(
'username' => 'foo',
'password' => 'bar'
);
echo json_encode($arr);
>
这个程序就是把$arr这个数组变成json格式的数据显⽰出来。php5以上都⽀持json_encode,如果是php4需要⼀个额外的⽀持程序,可以去。
第⼆个php程序是把从unity3d post过去的json数据转成数组使⽤。取名叫test1.php,也很简单。
Java代码
1. <?php
2. $jsonstring=$_POST["jsonstring"];
3. $jsondata=json_decode(stripslashes($jsonstring),true);
4. echo $jsondata["password"];
5. ?>
<?php
$jsonstring=$_POST["jsonstring"];
$jsondata=json_decode(stripslashes($jsonstring),true);
echo $jsondata["password"];
>
在Unity⾥怎么⽤呢?也不难,下⾯是代码,随便取个什么名字都⾏。我取名叫jsontest.js。 Java代码
1. var jsonURL="localhost/json/test.php";
2. var jsonURL1="localhost/json/test1.php";
3. function Start(){
4. //获取json数据的⽅法
5.    var getwww : WWW = new WWW (jsonURL);
6.    yield getwww;
7.    var jsonObj1=eval(getwww.data);
8.    print (jsonObj1["username"]);
9.    //提交JSON数据的⽅法
10.    var mydata=new Boo.Lang.Hash();
11.    mydata["username"]="hello";
12.    mydata["password"]="world";
13.    //将数据转换为json字符串
14.    var jsonstring=ToJSON(mydata);
15.    var form = new WWWForm();
16.    form.AddField("jsonstring", jsonstring);
17.    var postwww: WWW = new WWW(jsonURL1, form);
18.    yield postwww;
19.    print(postwww.data);
20. }
21. /**
22. * 转换JSON
23. */
24. static function ToJSON(obj){
25.    if (obj==null) return "null";
26.    var results=new Array();
27.    for (var property in obj){
28. results.push("\""+property.Key+"\" : \""+property.Value+"\"");
29.    }
30.    return "{"+results.join(" , ")+"}";
31. }
var jsonURL="localhost/json/test.php";
var jsonURL1="localhost/json/test1.php";
function Start(){
//获取json数据的⽅法
var getwww : WWW = new WWW (jsonURL);
yield getwww;
var jsonObj1=eval(getwww.data);
print (jsonObj1["username"]);
//提交JSON数据的⽅法
var mydata=new Boo.Lang.Hash();
mydata["username"]="hello";
mydata["password"]="world";
//将数据转换为json字符串
var jsonstring=ToJSON(mydata);
var form = new WWWForm();
form.AddField("jsonstring", jsonstring);
var postwww: WWW = new WWW(jsonURL1, form);
yield postwww;
print(postwww.data);
}
/**
* 转换JSON
*/
static function ToJSON(obj){
if (obj==null) return "null";
var results=new Array();
for (var property in obj){
results.push("\""+property.Key+"\" : \""+property.Value+"\"");
}
return "{"+results.join(" , ")+"}";
}
在Start()⾥,直接⽤eval把json转成boo.lang.hash格式,取出username,看console的话可以看到显⽰出了foo,也就是php⾥⾯
$arr['username']。接着再提交⼀个username和password,叫hello和world,然后把php获取的反馈显⽰出来,会看到console⾥显⽰了world。
ToJSON()函数是我写的⼀个简单函数,就是把Boo.lang.hash数组转成json字符串,只能处理⼀维数组,如果谁有兴趣可以改⼀下让它⽀持多维数组。
这样⼀来,原来我习惯的json数据传输就可以⽤了,如果熟悉使⽤json格式的朋友会⽅便多了,原来习惯使⽤xml格式的朋友也推荐你研究下这种简单⽅便的格式,会提⾼⼀些程序效率。
呃,论坛在safari下不能⽤discuz代码模式…code标签只能换⽤firefox编辑下了……另外tojson那个函数之所以没⽀持多维数组,主要是不知道在原来ecma的javascript⾥的undefined这个东西在unity3d⾥怎么表⽰…
还是不设置回复可见,⼤家有⼈的捧个⼈场,有花的捧个花场,有分的捧个分场……=。=||
json⾥要正常传递中⽂请参考这个贴:
web3d.5d6d/thread-2217-1-1.html
json⾥⾯传中⽂基本搞定
u3d⾥⾯⽤json的办法参考这个帖⼦:
bbs.vrsh/thread-2095-1-1.html
那个例⼦有个问题就是,如果你传过来的数据带中⽂,到了u3d⾥,执⾏到
var jsonObj1=eval(getwww.data);
这⼀步的时候就会出错。原因是unity3d不⽀持\u转义,⽽json_encode函数在encode的时候就直接把中⽂变成了\u1234这种形式。
其实很好解决,echo之前先把转义的字符串变成中⽂就⾏了。unity3d不是浏览器,应该调⽤WWW的时候直接读的⼆进制数据,所以不会出错。
js_unescape这个函数是我抄来的……简单改了改
Java代码
1. <?php
2. $arr=array(
3.    'username' => '测试',
4.    'password' => 'bar'
5. );
6. echo  js_unescape(json_encode($arr));
7. function js_unescape($str)
8. {
9.        $ret = '';
10.        $len = strlen($str);
11.        for ($i = 0; $i < $len; $i++)
12.        {
13.            if ($str[$i] == '\\' && $str[$i+1] == 'u')
14.            {
15.                      $val = hexdec(substr($str, $i+2, 4));
16.                      if ($val < 0x7f) $ret .= chr($val);
17.                      else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));
18.                      else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));
19.                      $i += 5;
20.            }
js获取json的key和value21.            else $ret .= $str[$i];
22.        }
23.        return $ret;
24. }
25. ?>
<?php
$arr=array(
'username' => '测试',
'password' => 'bar'
);
echo  js_unescape(json_encode($arr));
function js_unescape($str)
{
$ret = '';
$len = strlen($str);
for ($i = 0; $i < $len; $i++)
{
if ($str[$i] == '\\' && $str[$i+1] == 'u')
{
$val = hexdec(substr($str, $i+2, 4));
if ($val < 0x7f) $ret .= chr($val);
else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));
else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));                        $i += 5;
}
else $ret .= $str[$i];
}
return $ret;
}
>
Java代码
1. var jsonURL="localhost/json/demo.php";
2. var show;
3. var chineseSkin : GUISkin;
4. function Start(){
5. //获取json数据的⽅法
6.    var getwww : WWW = new WWW (jsonURL);
7.    yield getwww;
8.    print (getwww.data);
9.    var jsonObj1=eval(getwww.data);
10.    print (jsonObj1["username"]);
11. show=jsonObj1["username"];
12. }
13. function OnGUI(){
14.      GUI.skin=chineseSkin;
15.      GUI.Button(Rect(10,10,100,20),show);
16. }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。