2015-07-03 71 views
2

我遇到了一段JSON和PHP的問題json_decode()。 我們從客戶的發佈解決方案收到JSON,儘管驗證通過,但其中的部分內容跳過了json_decode()PHP json_decode跳過源代碼JSON的一部分

{ 
"articles":{ 
    "article":{ 
    "title":"This is the title", 
    "document":{ 
     "text_article":{ 
      "p":[ 
       "- The first sentence.", 
       " " 
      ], 
      "h3":"The first subtitle", 
      "p":[ 
       "- One sentence.", 
       "Another sentence.", 
       "- A quote.", 
       " " 
      ], 
      "h3":{ 
       "strong":"Second subtitle" 
      }, 
      "p":[ 
       "An additional sentence", 
       "One more.", 
       { 
       "a":{ 
        "href":"https://www.example.com", 
        "target":"_blank", 
        "$":"Link text" 
       } 
       }, 
       "(Some extra information near the bottom)" 
      ] 
     } 
    }, 
    "knr":"0001" 
    } 
} 
} 

進口之後,它看起來是這樣的:

{ 
    "articles": { 
    "article": { 
     "title": "This is the title", 
     "document": { 
      "text_article": { 
       "p": [ 
        "An additional sentence", 
        "One more.", 
        { 
         "a": { 
          "href": "https://www.example.com", 
          "target": "_blank", 
          "$": "Link text" 
         } 
        }, 
        "(Some extra information near the bottom)" 
       ], 
       "h3": { 
        "strong": "Second subtitle" 
       } 
      } 
     }, 
     "knr": "0001" 
    } 
    } 
} 

我懷疑問題是幾個 「P」 和 「text_article」, 「H3」 元素的存在。但this online validator按預期顯示,所以我們的客戶覺得它是正確的。 (JSONLint顯示與json_decode()雖然相同的問題)

任何方式來獲得此正確導入到PHP,或者我正確推動重寫代碼?

回答

3

你不會那麼工作。 json_decode將數據導出爲php對象或數組 - 因此不允許重複的鍵/屬性。

也許你可以說服客戶改變JSON格式弄成這個樣子:

{ 
    "articles":{ 
     "article":{ 
      "title":"This is the title", 
      "document":{ 
       "text_article":[ 
        { 
         "type":"p", 
         "content":[ 
          "- The first sentence." 
         ] 
        }, 
        { 
         "type":"h3", 
         "content":[ 
          "The first subtitle." 
         ] 
        }, 
        { 
         "type":"p", 
         "content":[ 
          "- One sentence.", 
          "Another sentence.", 
          "- A quote." 
         ] 
        } 
       ] 
      }, 
      "knr":"0001" 
     } 
    } 
} 

在那裏,你必須爲每個標籤的數組text_article包含對象 - 每個包含內容的數組。對象可以根據需要通過其他屬性進行擴展。

+0

這是PHP的限制,可能不存在於其他編程語言中?在這種情況下,客戶可能是正確的,我需要看一箇中間解決方案。 – Rune

+0

我不知道任何編程語言沒有這個限制。我相當肯定,所使用的開發語言不應該依賴於客戶提供的數據格式。至少,您可以編寫某種解析器,它在使用'json_decode'之前更改json文件的結構。 – dhh

+0

看起來最好的解決方案就像你所建議的那樣,我會試着讓客戶改變他們的JSON來使用一個數組。 – Rune

1

只是增加一個可能的選擇...

jsonlint可以用來驗證您的JSON字符串。它將需要參數來忽略/檢測重複鍵。

雖然這不會解決您的問題,但至少您可以檢測到任何錯誤,以避免數據損壞。