请教关于 PHP 的 json_encode 问题,是不是它的格式跟 Python , Java 生成的有些不一样?

2019-06-23 09:07:12 +08:00
 LeeLou
以下是一个 soap 的接口,往该接口的 funMain 方法上,传输一个 json,就可以发送短信了。这个是 php 的代码,显示失败
$url = 'http://***/wsApi?wsdl';
$content=’ this is a test message';
$funcode = '1002'; //自定义扩展代码(模块)
$ApplicationID = 'HsqjSYsn6QjTrqzdW'; //账号
$Password = '6VnLZlVwKf'; //密码
$paras = array(
'content' =>$content,
'funCode' =>$funcode,
'applicationId' =>$ApplicationID,
'password' =>$Password);

$sendInfo=array(
'sendId' =>'0',
'mobile' =>'18899990000'); //手机号码
$paras['sendInfo'] ][0]=$sendInfo;
$client = new soapclient($url);
$result=$client->funMain(json_encode($paras));

而用 python,是没有问题的。
import sys
import json
import suds

from suds.client import Client

url='http://***/wsApi?wsdl'
c=Client(url)

def sms(phonenumber,text):

data={\
'applicationId': 'HsqjSYsn6QjTrqzdW5K',\
'password': '6VnLZlVw',\
'funCode': '1002',\
'content': 'this is for what you want to sent',\
'sendInfo': [\
{\
'sendId': '0',\
'mobile': '188990000'\
}\
]\
}



data['content']=text
data['sendInfo'][0]['mobile']=phonenumber
d=json.dumps(data)


e=c.service.funMain(d)






if __name__=='__main__':

if len(sys.argv)!=3:

print ('Usage:python need 2 string')

exit(1)

phonenumber=sys.argv[1]

text=sys.argv[2]

try:

sms(phonenumber,text)
except:
print ('duanxinji failure')
4455 次点击
所在节点    PHP
22 条回复
rickygao
2019-06-23 09:10:21 +08:00
你自己把 json 打印出来比较一下不就完了,还至于来这问
wangsongyan
2019-06-23 09:15:22 +08:00
不懂 PHP,不过 data 是 object,不是 array
LeeLou
2019-06-23 09:15:42 +08:00
@rickygao ,打印出来看过,其实看不出任何区别。我还把 python 那边打印出来的字符串,直接输入 php 里作为字符串,提交了还是不对,难道是我用的函数方法不对吗? 但是返回代码的格式却是一模一样的
wangsongyan
2019-06-23 09:28:47 +08:00
@wangsongyan sorry,查了下不是这个问题。比较下生成的 json 字符串吧
RobinT9
2019-06-23 09:30:28 +08:00
想看你 py 成功的字符串
Trim21
2019-06-23 09:32:31 +08:00
$paras['sendInfo'] ][0]=$sendInfo;
Trim21
2019-06-23 09:34:00 +08:00
而且上面下面的手机号也不一样…生成的 json 真的一样吗
oott123
2019-06-23 11:52:44 +08:00
你都把 python 的 json 放到 php 里都不对,还在怀疑 json ?不应该调查下发请求的方法吗?
LeeLou
2019-06-23 12:46:22 +08:00
@Trim21 手机号只是一个比方,并没有把真的手机号发出来。
@oott123 对 php 不了解,不知道怎么查发请求的方法对不对了,但有回应,而且请求的方法也一样,不应该有问题把
@RobinT9 错误返回码如下:
stdClass Object
(
[return] => <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<data>
<batchId></batchId>
<response/>
<resultCode>1</resultCode>
<resultMsg></resultMsg>
</data>

)
wo642436249
2019-06-23 13:22:58 +08:00
生成的是一个 json 字符串
garlics
2019-06-23 13:25:52 +08:00
你看下 funMain 这个方法参数需要传的是字符串还是数组
Foctee
2019-06-23 13:53:37 +08:00
楼主贴出的 php 代码有两个语法错误
$content=’ this is a test message'; 楼主想要的应该是=> $content= 'this is a test message';
$paras['sendInfo'] ][0]=$sendInfo; 楼主想要的应该是=> $paras['sendInfo'][0]=$sendInfo;
然后我把修改后的代码运行了之后,json 输出的是=>
{"content":"this is a test message","funCode":"1002","applicationId
":"HsqjSYsn6QjTrqzdW","password":"6VnLZlVwKf","sendInfo":[{"sendId":"0","mobile"
:"18899990000"}]}"
imdong
2019-06-23 14:15:00 +08:00
根据 json 规范(如果我没记错的话),json 中的 key 和 字符串 value 必须用双引号。

而 php 生成的 json 是符合这个规范的(相关我已知的所有规范)

而楼主提供的 py 代码中,json 是 单引号。
是创建一个对象,然后生成 json 么?

假设如此,在 php 中如果,是数组 不能用
$paras['sendInfo'] ][0]=$sendInfo

要改成

```
$paras = array(
'content' => $content,
'funCode' => $funcode,
'applicationId' => $ApplicationID,
'password' => $Password,
'sendInfo' => []
);

$sendInfo = array(
'sendId ' => '0',
'mobile ' => '18899990000'//手机号码
);
$paras['sendInfo'][] = $sendInfo;
```

不然 $paras['sendInfo'] 会是一个对象

对象的 key 是 0
Dogergo
2019-06-24 09:47:33 +08:00
你需要看接口需要的是一个 JSON 字符串还是一个 JSON 对象,php json_encode 是默认字符串的话,如果需要转成 json 对象需要传递额外参数 JSON_FORCE_OBJECT
LeeLou
2019-06-24 09:50:58 +08:00
@imdong 'sendInfo' => []是直接报错的,不行。$paras['sendInfo'][]和$paras['sendInfo'][0]的效果可能一样。改了这个还是不行。 我的 php 版本比较低 5.1.6
@Foctee 不好意思,之前发帖子的时候,没有注意,那两个其实是对的。
@garlics,不是特别清楚,funMain 方法要的是什么,但是从 python 来看,应该是 json 字符串吧
imdong
2019-06-24 09:59:44 +08:00
!!!!!!! 5.1.6 ???你没打错吧,不是 7.1 ?

不好意思,版本太老没用过,劝退了。
garlics
2019-06-24 14:53:47 +08:00
@LeeLou 这个不一定,或许你可以试下$result=$client->funMain($paras);
你可以看下他这个函数是怎么实现的啊
encro
2019-06-24 15:14:34 +08:00
为什么不怀疑是 wsdl 的问题,PHP 的 wsdl 是有一点不标准的,有比较 encode 的结果吗?

另外,json_encode 有参数,建议看看 https://www.php.net/manual/en/function.json-encode.php
LeeLou
2019-06-25 08:10:37 +08:00
@encro,肉眼看不出 encode 的结果,就算直接把 python 的结果直接从 php 发出去也失败
encro
2019-06-25 09:06:02 +08:00
肉眼看不出 encode 的结果?
是看不出区别还是没有弄出来?
@LeeLou

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/576563

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX