您的位置:首页 > 移动开发 > Unity3D

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

2013-12-25 12:26 866 查看
Agine

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

1 从服务器的php程序里读一个json数据,然后把内容显示出来。 

2 把一个数据结构转换为JSON传给服务器。 

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

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

取名叫test.php 

Java代码 

 





<?php   

$arr=array(   

   'username' => 'foo',
  

   'password' => 'bar'  

);   

echo json_encode($arr);   

?>  

[java] view
plaincopy

<?php  

$arr=array(  

   'username' => 'foo',  

   'password' => 'bar'  

);  

echo json_encode($arr);  

?>  

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

第二个php程序是把从unity3d post过去的json数据转成数组使用。取名叫test1.php,也很简单。 

Java代码 

 





<?php   

$jsonstring=$_POST["jsonstring"];
  

$jsondata=json_decode(stripslashes($jsonstring),true);
  

echo $jsondata["password"];
  

?>  

[java] view
plaincopy

<?php  

$jsonstring=$_POST["jsonstring"];  

$jsondata=json_decode(stripslashes($jsonstring),true);  

echo $jsondata["password"];  

?>  

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

Java代码 

 





var jsonURL="http://localhost/json/test.php";
  

var jsonURL1="http://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(" , ")+"}";
  

}  

[java] view
plaincopy

var jsonURL="http://localhost/json/test.php";  

var jsonURL1="http://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里要正常传递中文请参考这个贴: 
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代码 

 





<?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] view
plaincopy

<?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代码 

 





var jsonURL="http://localhost/json/demo.php";
  

var show;   

var chineseSkin : GUISkin;   

function Start(){   

//获取json数据的方法   

   var getwww : WWW = new WWW (jsonURL);
  

   yield getwww;   

   print (getwww.data);   

   var jsonObj1=eval(getwww.data);   

   print (jsonObj1["username"]);
  

show=jsonObj1["username"];
  

}   

function OnGUI(){   

      GUI.skin=chineseSkin;   

      GUI.Button(Rect(10,10,100,20),show);
  

}  

[java] view
plaincopy

var jsonURL="http://localhost/json/demo.php";  

var show;  

var chineseSkin : GUISkin;  

function Start(){  

//获取json数据的方法  

   var getwww : WWW = new WWW (jsonURL);  

   yield getwww;  

   print (getwww.data);  

   var jsonObj1=eval(getwww.data);  

   print (jsonObj1["username"]);  

show=jsonObj1["username"];  

}  

function OnGUI(){  

      GUI.skin=chineseSkin;  

      GUI.Button(Rect(10,10,100,20),show);  

}  

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

===== 

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

比如改成 

Java代码 

 





$arr=array(   

   'username' => '你好',
  

   'password' => 'bar',
  

    'a' => array(
  

             "name" => "aaa",
  

             "pass" => "bbb"  

   )   

);  

[java] view
plaincopy

$arr=array(  

   'username' => '你好',  

   'password' => 'bar',  

    'a' => array(  

             "name" => "aaa",  

             "pass" => "bbb"  

   )  

);  

显示的时候 

Java代码 

 





print (jsonObj1["a"]["name"]);  

[java] view
plaincopy

print (jsonObj1["a"]["name"]);  

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

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

是完全可以的,忘了xml吧。不过从u3d传到web上目前我那个代码没实现json树形结构,只能传递1层的,改改应该也可以实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: