`

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

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

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

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

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

取名叫test.php

    <?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,也很简单。

    <?php
    $jsonstring=$_POST["jsonstring"];
    $jsondata=json_decode(stripslashes($jsonstring),true);
    echo $jsondata["password"];
    ?>


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

    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这个函数是我抄来的……简单改了改

    <?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;
    }
    ?>



    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的方法,对于树形结构同样有效:

比如改成

    $arr=array(
       'username' => '你好',
       'password' => 'bar',
        'a' => array(
                 "name" => "aaa",
                 "pass" => "bbb"
       )
    );


显示的时候

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



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

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

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

相关推荐

    Unity3D中任意类型数据转换成json数据的方法2

    在Unity3D开发中,JSON(JavaScript Object Notation)是一种常用的数据交换格式,因其轻量级、易读易写的特点,常用于存储和传输数据。本文将深入探讨如何在Unity3D中将任意类型的数据转换成JSON格式。 首先,我们...

    unity 自动excel转json插件

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也方便机器解析和生成。在Unity中,JSON常用于存储和加载非结构化的数据,比如角色属性、游戏设置等。将Excel转换为JSON,...

    unity3d Json转换类库LitJson

    在处理数据交换或序列化时,JSON(JavaScript Object Notation)是一种常用的轻量级格式,易于人阅读和编写,同时也方便机器解析和生成。在Unity3D中,有许多库可以用于JSON的序列化和反序列化,其中之一就是...

    Unity3D教程:引用第三方DLL解析JSON2

    在Unity3D游戏开发中,数据交换是必不可少的环节,特别是在服务器和客户端之间进行通信时。JSON作为一种轻量级的数据交换格式,因其简洁、易读的特性被广泛应用于各种网络应用和游戏中。本教程主要讲解如何在Unity3D...

    Unity能够在WebGL包使用的json解析.dll

    在Unity中,开发人员经常需要处理JSON(JavaScript Object Notation)数据,这是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON解析.dll是Unity中用于处理JSON数据的库,它允许开发者...

    Unity3D 3.0json处理入门教程

    在Unity3D 3.0开发中,处理JSON数据是一项重要的任务,特别是在游戏开发中,数据交换和存储经常需要这种轻量级的数据格式。本文将介绍如何使用LitJson框架进行JSON处理,这是一个专为Unity设计的简单且高效的库。 ...

    Unity3D_42_XML与JSON导出还原场景

    通过这个教程,开发者将掌握在Unity3D中利用XML和JSON进行数据序列化的技巧,这对于游戏存档、云端同步或者在多平台之间共享游戏状态都是至关重要的技能。在实际项目中,这种能力可以极大地提升游戏体验,同时降低...

    unity3d xml json读写

    在Unity3D游戏开发中,数据的存储和交换是一个关键环节。XML(eXtensible Markup Language)和JSON(JavaScript Object Notation)是两种广泛使用的轻量级数据格式,它们都可以方便地在Unity中进行读写操作。XML以其...

    Unity3d json库 ios上无错

    在Unity3D游戏开发中,数据交换和存储通常涉及到JSON(JavaScript Object Notation)格式,因为JSON具有轻量级、易读写、平台无关的特性。对于iOS平台,由于其安全性和性能要求,使用能够避免反射的JSON库是至关重要...

    Unity资源导出成json文件供网页加载

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,是Web服务间数据传输的理想选择。 Unity中的资源包括模型、纹理、动画等,这些都可以在场景中进行...

    unity xlua 已集成json和pb

    通过这种集成,开发者可以在Unity项目中灵活地选择JSON或PB作为数据交换格式,根据实际需求权衡速度、体积和便利性。同时,借助XLua,可以在Lua脚本中直接处理这些数据,提高了开发效率和代码的可维护性。这在处理...

    Unity3D教程:解析Json1

    在Unity3D开发中,Json数据格式是一种广泛用于数据交换的文本格式,因其简洁和易于解析而备受青睐。本文将详细介绍如何在Unity3D中使用Json进行数据解析,特别是通过LitJson这一开源组件。 首先,引入LitJson组件是...

    unity3d通信类库

    在Unity3D中,通信类库主要用于实现客户端与服务器之间的数据交换。这些类库可以是Unity内置的,也可以是第三方提供的,如标题中提到的"Warensoft.Unity.Communication.Client.dll"和"Warensoft.DataService.dll"。 ...

    jsonfx-for-unity3d

    JSONFX for Unity3D 是一个专门针对Unity3D游戏引擎设计的JSON序列化与反序列化库,它的核心是JsonFX.Dll,用于在Unity3D项目中处理JSON数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其...

    Newtonsoft.Json-for-Unity-master

    在Unity游戏开发中,数据交换与序列化是必不可少的部分,Newtonsoft.Json是一个广泛使用的JSON序列化库,尤其在C#开发中极为流行。这个名为"Newtonsoft.Json-for-Unity-master"的压缩包正是Newtonsoft.Json库的Unity...

    PHP结合unity3d

    3. **数据序列化与反序列化**:在PHP和Unity3D之间交换数据时,需要将数据转换为双方都能理解的格式,如JSON或XML。Unity3D提供了JsonUtility类来序列化和反序列化C#对象,而PHP有json_encode和json_decode函数处理...

    Unity3D教程:LitJson例子解析1

    在开发过程中,处理JSON数据是一项常见的任务,因为JSON格式是网络上广泛使用的轻量级数据交换格式。 LitJson是Unity3D中一个轻量级的JSON库,用于方便地进行JSON数据的序列化和反序列化。 本文主要讲解了如何在...

    Unity3D脚本:Unity3D使用LitJson解析服务器上的JSON1

    在Unity3D开发中,与服务器进行数据交互是常见的需求,而JSON作为一种轻量级的数据交换格式,广泛用于网络通信。本文将详细讲解如何在Unity3D中利用LitJson库来解析从服务器获取的JSON数据。 首先,确保你的Unity...

    unity多语言操作和excel转xml,json,csv

    - JSON(JavaScript Object Notation)是另一种流行的轻量级数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。Unity内置了JSON序列化和反序列化的支持。 - 使用类似的方法,将Excel转换成JSON格式,...

    Unity构建WebGL并集成MQTT使用Json传输数据

    综上所述,本项目涉及到Unity3D开发WebGL应用,利用MQTT进行实时通信,并使用JSON作为数据交换格式。通过这种方式,开发者可以创建互动性强、数据实时更新的Web应用程序,适用于各种在线游戏、教育模拟、虚拟现实...

Global site tag (gtag.js) - Google Analytics