1. 程式人生 > >json_encode()為null,引發的json相關總結

json_encode()為null,引發的json相關總結

上次使用 json_decode() 解析從前端複製過來的json資料,發現怎麼都解析不出來,檢視json格式,發現沒問題啊!

/*
    注意:
        之前碰過同樣的問題,有可能是實體引起的!但那應該是針對從其他地方接收到的變數,而非是複製過來的字串!
        碰到這種問題,可以使用 html_entity_decode()
 */

下面黏貼下,我複製過的大概的字串:
    $str = "[{'name':'dongxuemin','age':30},{'name':'yangyaping','age':30}]";
反正讓我看,我是真的看不出錯誤!

下面,揭曉答案:
    上面的錯誤是:json字串的格式不正確!
    正確的是:

        ******
            json中的 '鍵' 和 '值',都必須是雙引號("),在json裡只能用雙引號表示字串。
        ******

    JSON字串嚴格要求!!!說實話,沒細看過json,我是真心不知道這個!上面的還是我花了不少時間測出來的。
    先定義一個相同的陣列:
        $a = [
            ['name' => 'dongxuemin', 'age' => 30],
            ['name' => 'yangyaping', 'age' => 30],
        ];
        echo json_encode($a);   // 輸出:[{"name":"dongxuemin","age":30},{"name":"yangyaping","age":30}]
    然後和之前的字串一個一個對比,整了好久的!

PHP手冊的例子,有一個就指出了幾個經常錯誤的原因:
    <?php

    // the following strings are valid JavaScript but not valid JSON(下面字元是有效的js字串,但無效的JSON)

    // the name and value must be enclosed in double quotes
    // single quotes are not valid(物件的鍵和值,必須是 '雙引號')
    $bad_json = "{ 'bar': 'baz' }";
    json_decode($bad_json); // null

    // the name must be enclosed in double quotes(物件的鍵,必須使用雙引號,js中可不新增引號,但json不可以)
    $bad_json = '{ bar: "baz" }';
    json_decode($bad_json); // null

    // trailing commas are not allowed(最後面的 ',' 多餘)
    $bad_json = '{ bar: "baz", }';
    json_decode($bad_json); // null
    ?>

找到問題後,就想對 JSON 稍微瞭解一點,就找了點文章看看:
    具體就不總結了,有點晚。其實下面幾篇文章總結的都不錯(自己看下)


參考文章:
    http://php.net/manual/zh/book.json.php(PHP文件的JSON擴充套件)
    http://www.faqs.org/rfcs/rfc7159.html(PHP實現的JSON標準)
    http://www.json.org/json-zh.html(JSON官網??)
    http://www.ruanyifeng.com/blog/2009/05/data_types_and_json.html(阮一峰寫的部落格,真的是精闢!有時間應該全部拜讀一遍!)
    http://www.cnblogs.com/jamesbd/p/4185342.html
    http://www.cnblogs.com/pinganzi/p/6229369.html
    http://blog.csdn.net/leedaning/article/details/70210770


PHP官網的JSON,也瞭解了下:
    4個函式:
        json_encode($value [, $options = 0 [, $depth = 512]])
            $value - 可以是除了 'resource' 型別外的其他7種類型
                     編碼必須是 'UTF-8'
            $options - 可以使用多個
                JSON_HEX_QUOT -
                JSON_HEX_TAG - 
                JSON_HEX_AMP - 
                ...
                我們平常說,編碼中文,不亂碼,可以使用 'JSON_UNESCAPED_UNICODE'
            $depth - 設定最大深度(不用管)

        json_decode($json [, $assoc = false [, $depth = 512 [, $options = []]]])
            $json - 要解析的json字串
                    編碼必須是 'UTF-8'
            $assoc - 是否返回關聯陣列,預設是false,表示返回物件(assoc - 從單詞上就知道是 '關聯' 意思)
            $depth - 指定遞迴深度(不用管)
            $options - 只有2個
                JSON_BIGINT_AS_STRING - 用於將大整數轉為字串而非預設的float型別
                JSON_OBJECT_AS_ARRAY - 與將assoc設定為 TRUE 有相同的效果(返回關聯陣列)

        // 2個都是,返回json編碼或解碼時,最後發生的錯誤
        json_last_error()       // 返回的是 '錯誤碼'
        json_last_error_msg()   // 返回的是 '錯誤詳情'

        // 錯誤碼
        JSON_ERROR_NONE - 無錯誤
        JSON_ERROR_DEPTH - 到達了最大堆疊深度
        JSON_ERROR_STATE_MISMATCH - 無效或異常的 JSON
        JSON_ERROR_CTRL_CHAR - 控制字元錯誤,可能是編碼不對
        JSON_ERROR_SYNTAX - 語法錯誤
        JSON_ERROR_UTF8 - 異常的 UTF-8 字元,也許是因為不正確的編碼
        ... 還有更多,自己看文件 ...

    JsonSerializable - JSON序列化介面
        /*
            注意:
                這個才是要解釋的重點!
         */
        介面定義:
            JsonSerializable {
                // 指定需要被序列化成 JSON 的資料(指定傳遞給 json_encode($value) 的$value內容)
                abstract public mixed jsonSerialize ( void )
            }
        解釋下這個介面存在的意義:
            預設情況下,json_encode()一個物件,會將物件的所有屬性,編碼為一個json物件。例如:
                class prev {
                    $name = 'dongxuemin';
                    $age = 30;
                    function a(){

                    }
                    ...
                }
                json_encode(new prev());        // 輸出 "{'name': 'dongxuemin', 'age': 30}"
            如果定義一個類,實現了該介面,並定義了方法
                class now implements JsonSerializable{
                    $name = 'dongxuemin';
                    $age = 30;
                    public function jsonSerialize(){
                        return '我才是要編碼的資料';
                    }
                    ...
                }
                json_encode(new now());        // 輸出 "我才是要編碼的資料"
            以上2個例子,我們很明顯就知道區別了。實現了 JsonSerializable 介面的類,json_encode()時,會去查詢 'jsonSerialize()' 方法,有的話,會將返回的內容,作為json_encode()的輸入,而不是之前預設的將物件的屬性作為json_encode()的輸入

        laravel的資料庫物件就使用了它(好多優秀的框架,應該都實現了它),toJson()方法就是
    參考文章:
        http://www.laruence.com/2011/10/10/2204.html(PHP國內第一人)
        https://segmentfault.com/a/1190000010449725


相關推薦

json_encode()null引發json相關總結

上次使用 json_decode() 解析從前端複製過來的json資料,發現怎麼都解析不出來,檢視json格式,發現沒問題啊! /* 注意: 之前碰過同樣的問題,有可能是實體引起的!但那應該是針對從其他地方接收到的變數,而非是複製過來的字串!

【spring mvc】後臺的API測試中總提示接口實體的某一個字段不能null但是明明給值了還提示不能

ont TP 報錯 分享 ima 技術 技術分享 圖片 request 實體是這三個字段 接口的實現類Controller 前臺測試給值 依舊報錯 解決方法: 需要添加@RequestBody註解 【spring mvc】後臺的API,

Mysql數據表字段設置了默認值插入數據後默認字段的值卻null不是默認值

才會 默認 自動 nbsp tis 數據 過濾 工具 持久 我將mysql的數據表的某個字段設置了默認值為1,當向該表插入數據的時候該字段的值不是默認值,而是null。 我的錯誤原因: 對數據庫的操作我使用了持久化工具mybatis,插入數據的時候插入的是整個實體,直接

c# 如果一個對象的值null那麽它調用擴展方法時甚麽不報錯

tro img 數據類型 一個 emp void person () rem 如果一個對象的值為null,那麽它調用擴展方法時會報錯嗎? Person p = null ; p.ExtendMethod(); 上述代碼出現的情況不會報錯,剛開始遇到這種情況時很納悶,就去

破解myeclipse時ACTIVATION_KEY 老是null是由於cracker的開啟方式不對

破解myeclipse時,ACTIVATION_KEY 老是為null 首先檢查電腦裡是否配置好jdk只有一個myeclipse,如果有多個的話刪除為只有一個,或者全部刪除重新安裝,注意應在“控制面板”中的“程式與應用”中進行搜尋刪除,這裡可以將mye

java中將物件賦值null對垃圾回收有用嗎?

相信,網上很多java效能優化的帖子裡都會有這麼一條:儘量把不使用的物件顯式得置為null.這樣有助於記憶體回收      可以明確的說,這個觀點是基本錯誤的.sun jdk遠比我們想象中的機智.完全能判斷出物件是否已經no ref..但是,我上面用的詞是"

Spring @Autowired註解在非Controller注入nullSpringboot @Reference注入null解決方案

今天使用activiti的執行流程,使用dubbo想要去呼叫service,發現@Reference為null,研究了好久,嘗試直接連線dao層,注入的也為null。. 可能是我的這個不是controller裡面的 解決辦法 通過新增三個關鍵地方即可解決: 1、在cl

DB中欄位null空字串空格要怎麼過濾取出有效值

比如要求取出微信繫結的,沒有解綁的 未繫結,指定欄位為null 繫結的,指定欄位為某個字串 解綁的,有的客戶用的是更新指定欄位為1,有的客戶更新指定欄位為‘1’ 髒資料的存在,比如該欄位為空字串 髒資料的存在,比如該欄位為空格 要怎麼過濾出來? 解綁後指定欄位更新為‘1’ 取出繫結的會員,假設欄位是aa

mybatis查詢返回的物件不null但是屬性值null

返回的物件不為null,但是屬性值為null 程式碼如下: <resultMap id="BaseResultMap" type="com.trhui.ebook.dao.model.MerchantUser"> <id column="MU_ID" jd

java中只宣告一個物件不賦值與宣告一個物件並賦null有啥區別?

轉自:http://www.oschina.net/question/557858_127408 http://zhidao.baidu.com/link?url=rp_hAuPys2vMPnir0t7IFccKVnwEm8zHI7-wEoBSJXw05SAmKHGOObT

獲取的欄位值是空值或者null而你自己的需求就是想要獲取的欄位一個 * 預設的值

一、業務闡述   在開發中查詢的資料庫結果集,既要連線資料庫、執行資料庫操作、關閉資料庫,還要把結果集的記錄人為的設定到自己封裝的DAO中等一系列的重複程式碼。 本文主要是想解決:使用者只需要得到資料庫連線,寫sql語句,自己封裝dao,其餘的操作由封轉的

hashtable,concurrenthashmap為什麼鍵和值不能null而hashmap可以?

因為hashtable,concurrenthashmap它們是用於多執行緒的,併發的 ,如果map.get(key)得到了null,不能判斷到底是對映的value是null,還是因為沒有找到對應的key而為空,而用於單執行緒狀態的hashmap卻可以用cont

linux新建使用者使用者組相關總結

useradd tomcat_boot #建立tomcat_boot使用者,同時會建立一個同名的工作組tomcat_boot passwd tomcat_boot #設定tomcat_boot使用者密碼 userdel tomcat_boot #刪除tomca

row.getCell()獲取單元格null空指標異常

if(row.getCell(j+3) == null){ row.createCell(j+3).setCellValue(new HSSFRichTextString(String.valueOf(resultList.get(j)))); }else {

如果物件的引用被置null垃圾收集器是否會立即釋放物件佔用的記憶體?

連結:https://www.nowcoder.com/questionTerminal/fbef4d5971ce4009aa72

alibaba的JSON.toString會把值null的字段去掉謹記

sys bold new TE con ali round spa 結果 alibaba的JSON.toString會把值為null的字段去掉,謹記     Map<String,Object> map = new HashMap<>();

Jackson 轉換JSONSpringMVC ajax 輸出當值null或者空不輸出欄位@JsonInclude

當我們提供介面的時候,  Ajax  返回的時候,當物件在轉換  JSON  (序列化)的時候,值為Null 或者為“”的欄位還是輸出來了。看上去不優雅。 現在我敘述三種方式來控制這種情況。 註解的方式( @JsonInc

資料庫儲存null自定義字元標識。使轉為json資料後列不丟失或有undefined。

當查詢的資料中,列mno為空時,用“-”代替,也可以用中文之類代替,比如“暫空”,這裡採用“-”代替。 只需要在sql語句新增IFNULL(m.mno,’-‘) AS mno進行處理即可,例如: SELECT IFNULL(m.mflighno,'-') AS mflighno,m.*

php使用json_encode()無法將json字串轉換陣列.轉換的結果的null

要是使用json_decode()  字串的格式要如下: [ { "a": "hello", "b" : "world" } ]; 如果使用json_decode得到是null ,那麼很可能是 鍵名 沒有加引號 導致 ,要想上面的例子 鍵名a 有加引號這樣才能成功 的轉

json序列化時不序列化值null和""的欄位

<!-- jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId>