PHP更新版本无法解码json"版本如" string(例如:" 0.7.4" - >" 0.7")

时间:2015-10-27 15:17:53

标签: php json

在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正确解码它。但我不知道如何避免这个奇怪的问题。

有什么想法吗? 感谢

3 个答案:

答案 0 :(得分:2)

0.7.4无效JSON。
这是有效的JSON {&#34;数据&#34;:&#34; 0.7.4&#34;}
json.org

了解有关JSON的更多信息

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)

两件事:

  1. 不检查结果是否为empty(),检查结果是否为NULL。如果输入无法解码,json_decode将返回NULL。

  2. 输入字符串0.7.4是无效的JSON。 期间。它在PHP中工作at one point,但它完全有效mistake。您不应该依赖此行为,因为它不正确。

  3. 您的代码的修改版本应该如下所示:

    $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仅在嵌套在数组或对象中时才支持这些值。

来自:http://php.net/json_decode

如果您有$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)。