在Unity3D里使用JSON格式进行数据交换

来源:互联网 发布:剪辑录音软件 编辑:程序博客网 时间:2024/06/03 01:41
这个例子里做的事情很简单,主要做了两件事:

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. ?>  


这个程序就是把$arr这个数组变成json格式的数据显示出来。php5以上都支持json_encode,如果是php4需要一个额外的支持程序,可以去json.org找。

第二个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. ?>  


在Unity里怎么用呢?也不难,下面是代码,随便取个什么名字都行。我取名叫jsontest.js。

Java代码 复制代码 收藏代码
  1. var jsonURL="http://localhost/json/test.php";   
  2. var jsonURL1="http://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==nullreturn "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. }  


在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里要正常传递中文请参考这个贴:
http://web3d.5d6d.com/thread-2217-1-1.html

json里面传中文基本搞定

u3d里面用json的办法参考这个帖子:
http://bbs.vrsh.cn/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+24));   
  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.             }   
  21.             else $ret .= $str[$i];   
  22.        }   
  23.        return $ret;   
  24. }   
  25. ?>  



Java代码 复制代码 收藏代码
  1. var jsonURL="http://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. }  


需要字体才能显示出中文。另外注意.php文件的编码要设置成utf-8,u3d的js文件编码最好也设置成utf8。


=====

另外,上面链接的那个使用json的方法,对于树形结构同样有效:

比如改成

Java代码 复制代码 收藏代码
  1. $arr=array(   
  2.    'username' => '你好',   
  3.    'password' => 'bar',   
  4.     'a' => array(   
  5.              "name" => "aaa",   
  6.              "pass" => "bbb"  
  7.    )   
  8. );  


显示的时候

Java代码 复制代码 收藏代码
  1. print (jsonObj1["a"]["name"]);  



你会看到aaa显示出来,所以群里说的

    例如数据库查询结果,3条记录,每条记录里面包含姓名,性别,年龄。这个json也能取得后返回u3d吗?

是完全可以的,忘了xml吧。不过从u3d传到web上目前我那个代码没实现json树形结构,只能传递1层的,改改应该也可以实现。
原创粉丝点击