unity通过http获取和发送json数据

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


JSON格式是ajax里面比较常用的一种数据交换格式,比起xml来要方便,而且overhead很小。原来我做的web上的东西基本上数据传输很少用XML,都是用的JSON。关于JSON格式的好处和基础知识,不清楚的可以google一下,这里不详细写了。总体来说好处就是JSON比XML小、快、容易读,解析方便。
前两天写完那个javascript的贴子之后,就一直在琢磨,既然反正Unity3D用的是Javascript,而且支持eval,为啥不用JSON,还要用XML来做数据交换呢。google了一下,好像没有人提出过怎么在unity里使用json,国外就一个帖子还是想用但没解决的。

这个例子里做的事情很简单,主要做了两件事:

1 从服务器的php程序里读一个json数据,然后把内容显示出来。
2 把一个数据结构转换为JSON传给服务器。

所谓数据交换,一来一回,这个例子都做了。

首先第一个,写一个最简单的php程序生成json数据。

取名叫 test.php
复制代码
  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,也很简单。
复制代码
  1. <?php
  2. $jsonstring=$_POST["jsonstring"];
  3. $jsondata=json_decode(stripslashes($jsonstring),true);
  4. echo $jsondata["password"];
  5. ?>
在Unity里怎么用呢?也不难,下面是代码,随便取个什么名字都行。我取名叫 jsontest.js
复制代码
  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==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. }
在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格式的朋友也推荐你研究下这种简单方便的格式,会提高一些程序效率。:victory:

呃,论坛在safari下不能用discuz代码模式…code标签只能换用firefox编辑下了……另外tojson那个函数之所以没支持多维数组,主要是不知道在原来ecma的javascript里的undefined这个东西在unity3d里怎么表示…


json里要正常传递中文请参考这个贴:
http://www.cocoachina.com/bbs/read.php?tid-9881.html 
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值