自由、变革、分享!

PHP服务端和Java客户端之间对Json数据解析的那点破事

上一篇 / 下一篇  2013-07-06 12:20:04 / 个人分类:个人学习分享

    针对接口定义返回数据Json中data{ },返回是[ ]的问题,这两天学习了下PHP如何去encode生成Json字符串。

   看了服务端开发这边使用的Yii框架中的CJSON.php里的function encode($var),具体代码见下面链接:

  https://github.com/yiisoft/yii/blob/1.1.13/framework/web/helpers/CJSON.php

   代码里面对PHP中的array()变量encode是这样如下:

    case 'array':

      //treat as a JSON object

       if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {

              return '{' .

                        join(',', array_map(array('CJSON', 'nameValue'),

                                                           array_keys($var),

                                                           array_values($var)))

                        . '}';

       }

        //位置1

      //treat it like a regular array

       return '[' . join(',', array_map(array('CJSON', 'encode'), $var)) . ']';

   然后看了下服务端开发这边对返回json中的data的定义均为array()。接着了解了下PHP中的array(),这个类型貌似是Java中的MapList的集合体,非常强大。

   下面是对data两个举例:

    $data=array("a"=>"Dog","b"=>"Cat","c"=>"Horse");      //类似于java中的Map<String,String>

    $data=array("Dog","Cat","Horse");                                //类似于java中的List<String>

   当使用Yii框架中的CJSONencode上面两个array时,就会生成两种Json结果,分别是:

   前者treat as a JSON object对应是:        {"a":"Dog","b":"Cat","c":"Horse"}

   后者treat it like a regular array对应是:["Dog","Cat","Horse"]

   这两个Json字符串在java里显然需要两个不同类型的变量去直接获取数据。可用MapList分别去解析。

   综述,PHP是一种松散类型语言,不必向PHP声明该变量的数据类型,但是Java在使用变量之前,首先要申明变量类型,也就说变量类型确定了,就不能变化,比如说返回的data,同一个变量PHP可以有以上两种方式定义,Java则需要定义两个类型的data

   所以在返回数据时,可能需要服务端对Java的数据类型做下兼容,变量的类型需要固定下。

 

   最后,回到主题,对于服务端返回数据中data没有数据时,就是一个空的array(),空的array()在生产Json时就会用treat it like a regular array对应的方法。如果修改下Yii框架的函数encode($var),在上面位置1处加以下代码(由于不会PHP,不知语法是否正确):

    if (count($var)==0){

        return 'null';

    }

   无论array()具体格式是什么样子,只要为空,就返回null,这样子至少Java在解析返回数据的时候,就不会报错。

   当然这种做法是会对服务端的性能产生点影响,就是原本定义为[ ]data都会增加一个判断。没有找到方法去测试,如果可以也请高手们去做下性能的比较。

 

 

以上纯属个人见解,有问题的地方,请回复下。

另外一些个人的感受,虽然了解不多PHP是一门强大的语言,用起来实在方便,可以方便的看到开发人员的代码,进行学习。另外也要感谢开源世界给我们带来了很多的免费使用的框架,让我们可以任意修改框架源码。当然还有一点就是任何框架都不能满足自己业务的需要,有必要对框架做些修改,也不能说框架出来的东西也不一定就是正确的,满足需求的。



TAG:

 

评分:0

我来说两句

TestFuture

TestFuture

赶上大学扩招,随便选了据说是最热门的个专业;毕业时期偶遇经济危机,误打误撞进入测试行业,时间久了发现这趟水还很深,只是鄙人仍在岸边。

我的栏目

日历

« 2024-04-25  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 46462
  • 日志数: 13
  • 建立时间: 2011-03-23
  • 更新时间: 2013-07-06

RSS订阅

Open Toolbar