2011-07-14 106 views
3

我在嘗試解碼Java程序(傑克遜)的JSON輸出並遇到一些問題。 問題的原因是下面的代碼片段:JSON解碼問題

{ 
    "description": "... lives\uMOVE™ OFFERS ", 
} 

導致ValueError: Invalid \uXXXX escape

有關如何解決此問題的任何想法?

編輯:輸出是從一個Avro文件,Avro包使用傑克遜作爲JSON發射記錄。
編輯2:在源文件中戳動後,可能會出現JSON手動構建的情況(對不起傑克遜)。

+0

你是如何得到輸出的?你是否嘗試將其編碼爲utf-8? –

+0

我正在閱讀Python的輸出(運行java作爲子進程並讀取它的stdout)。我試圖使用utf-8 OutputStreamWriter,但它沒有改變任何事情。 – lazy1

回答

0

這是Avro版本< 1.6.0中的一個已知錯誤。有關更多詳細信息,請參閱AVRO-851

4

應該是什麼樣的原始字符串? \uXXXX是一個Unicode轉義序列,因此它將\ uMOVE解釋爲單個字符,但它不是有效的Unicode值。 JSON總是假定爲unicode的,所以你可能需要修復的字符串在原始應用

+0

原始應用程序是Avro包(記錄的toString方法)。所以我無法修復它在這個級別(除了寫我自己的JSON編碼器的記錄)。 – lazy1

+0

說明文字是來自您還是包裹?如果前者,它應該是什麼樣子? – dfb

+0

它來自Avro文件。 – lazy1

1

嘗試引述\u這樣的:

{ 
    "description": "... lives\\uMOVE™ OFFERS ", 
} 
+0

不起作用 - 'ValueError:期望屬性名稱' – lazy1

+0

也許這是一個雙重轉義問題。我能夠得到這個在Python中解析:'{「description」:「... lives \\\\ uMOVE™OFFERS」}' – Rich

1

基本輸入是不是有效的JSON。

關於http://www.json.org/的規範定義了字符串應該如何編碼。您將不得不修復其他應用程序的JSON輸出。

0

Jackson目前沒有配置功能來允許接受此類輸入。 (它是否與Jackson生成?)

您可以修改流解析器來處理它。跟蹤堆棧跟蹤到需要改變的方法。

你可以在http://jira.codehaus.org/browse/JACKSON提交變更請求對於要增強傑克遜提供這樣的功能,但我不知道該請求將如何流行的是,是否會永遠執行。

+0

它是用jacson生成的(它是avro文件的輸出) – lazy1

+0

Jackson不應該產生這樣的產出;但如果它確實如此,那將是一個傑克遜bug。 – StaxMan