在PHP中执行此代码我希望字符串Not a list <type 'str'>
[] <type 'list'>
Not a list <type 'NoneType'>
Not a list <type 'int'>
Not a list <type 'str'>
[1, 2, 3, 4] <type 'list'>
['a', 2, 'b'] <type 'list'>
Not a list <type 'dict'>
保持为"0.7.4"
https://3v4l.org/gX4vM
"0.7.4"
对于几乎所有PHP版本都是如此,但在我的AWS with PHP 5.6.9中,在这个php沙箱(5.6.4?)中,我得到了$value = "0.7.4";
if(!empty($value))
{
$jsonValue = json_decode($value);
if(!empty($jsonValue)) $value = $jsonValue;
}
print_r( $value,false);
http://ideone.com/2uuoHw
在我的代码0.7
中可以是可反序列化的字符串或简单的字符串(&#34; [&#39; a&#39;,&#39; b&#39;]&#34;,& #34; {&#39; a&#39;:&#39; 10&#39;}&#34;,&#34; abc&#34;,&#34; 2500&#34;等)和我期望json正确解码它。但我不知道如何避免这个奇怪的问题。
有什么想法吗? 感谢
答案 0 :(得分:2)
0.7.4无效JSON。
这是有效的JSON {&#34;数据&#34;:&#34; 0.7.4&#34;}
在json.org
JSON to Object:
public static void main(String[] args) {
try {
String refreshToken = "";
String clientID = "";
String clienSecret = "";
String p12 = "";
HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setClientSecrets(clientID, clienSecret)
.setServiceAccountPrivateKeyFromP12File(new File(p12))
.setServiceAccountScopes(Collections.singleton(BloggerScopes.BLOGGER))
.build();
credential.setRefreshToken(refreshToken);
credential.refreshToken();
System.out.println(credential.getAccessToken());
} catch (Exception e) {
e.printStackTrace();
}
}
JSON to Array:
$json = '{"data": "0.7.4"}';
$obj = json_decode($json);
var_dump($obj);
答案 1 :(得分:1)
两件事:
不检查结果是否为empty()
,检查结果是否为NULL。如果输入无法解码,json_decode
将返回NULL。
输入字符串0.7.4
是无效的JSON。 期间。它在PHP中工作at one point,但它完全有效mistake。您不应该依赖此行为,因为它不正确。
您的代码的修改版本应该如下所示:
$value = "0.7.4";
if( !empty($value) )
{
$jsonValue = json_decode($value);
if ( $jsonValue !== NULL ) {
// Pick a value to return
$value = $jsonValue->something;
} else {
// Do nothing, leave $value as is
}
}
var_dump($value);
答案 2 :(得分:1)
如上所述,0.7.4
不是有效的JSON(根据JSON规范),但PHP的json_decode
也可以解码标量值
PHP实现了原始»RFC 4627中指定的JSON超集 - 它还将编码和解码标量类型和NULL。 RFC 4627仅在嵌套在数组或对象中时才支持这些值。
如果您有$value ='"0.7.4"';
(7个字符),则json_decode()
会将此解码为字符串 0.7.4
。但由于您的值是0.7.4
(5个字符,因为它缺少双引号),因此无法解码。
https://3v4l.org/gX4vM上的示例无法解码$value
,只打印出原始值(请参阅:https://3v4l.org/e3um2)
编辑:对于某些奇怪的原因,http://ideone.com/2uuoHw处的示例正在将0.7.4
解码为 float 0.7
。这不应该发生。如果您使用0.7
说明,则应该$value = "0.7":
(请参阅:https://3v4l.org/H2W5M)。