2013-08-01 52 views
1

我創建客戶端,發送JSON編碼數據服務器Python的JSON編碼具有相同的密鑰(SOLR)是

數據例如:

{ 
"add": { 
    "doc": { 
    "id": "DOC1", 
    "my_boosted_field": { 
     "boost": 2.3, 
     "value": "test" 
    }, 
    "my_multivalued_field": [ "aaa", "bbb" ] 
    } 
}, 
"add": { 
    "commitWithin": 5000, 
    "overwrite": false,uniqueKey */ 
    "boost": 3.45, 
    "doc": { 
    "f1": "v1", 
    "f1": "v2" 
    } 
}, 

"commit": {}, 
"optimize": { "waitFlush":false, "waitSearcher":false }, 

"delete": { "id":"ID" }, 
"delete": { "query":"QUERY" } 
"delete": { "query":"QUERY", 'commitWithin':'500' } 
} 

正如你所看到的,有2字典與'添加'鍵螞蟻和3字典與'刪除'鍵。 它的可能性如何?

我用編碼數據:

data = {} 
data['delete'] = delete1 
data['delete'] = delete2 
data['delete'] = delete3 
print json.dumps(data) 

但它僅僅編碼delete3!

那麼如何使用相同的鍵創建JSON響應呢? json.dumps也許可以用相同的鍵編碼字典,但如何在Python中創建它們? Python字典的關鍵是獨特的...

感謝您的幫助!

回答

2

Python字典有唯一鍵。 JSON對象應該有唯一的名稱,但是您發現的SOLR示例違反了這一點。從JSON RFC引用:

對象內的名稱應該是唯一的。

因爲在Python字典,名稱獨一無二的,你不能使用標準json庫生成您顯示輸出。

如果您需要特定的輸出,您將不得不推出自己的編碼器。我會產生(action, dictionary)對元組的列表,然後用json庫編碼字典,然後使用字符串模板的最後一步:

data = [] 
data.append(('delete', delete1)) 
data.append(('delete', delete2)) 
data.append(('delete', delete3)) 

output = '{%s}' % ',\n'.join(['"{}": {}'.format(action, json.dumps(dictionary)) for action, dictionary in data]) 

這種方法在某些方面並不一脆弱」 t確保action值根據JSON規則被轉義,但只要操作值是簡單的不帶引號的ASCII字符串,它就可以正常工作。您始終可以將編碼添加到unicode_escape並手動轉義任何"字符。

演示:

>>> import json 
>>> delete1 = { "id":"ID" } 
>>> delete2 = { "query":"QUERY" } 
>>> delete3 = { "query":"QUERY", 'commitWithin':'500' } 
>>> data = [] 
>>> data.append(('delete', delete1)) 
>>> data.append(('delete', delete2)) 
>>> data.append(('delete', delete3)) 
>>> '{%s}' % ',\n'.join(['"{}": {}'.format(action, json.dumps(dictionary)) for action, dictionary in data]) 
'{"delete": {"id": "ID"},\n"delete": {"query": "QUERY"},\n"delete": {"query": "QUERY", "commitWithin": "500"}}' 
>>> print '{%s}' % ',\n'.join(['"{}": {}'.format(action, json.dumps(dictionary)) for action, dictionary in data]) 
{"delete": {"id": "ID"}, 
"delete": {"query": "QUERY"}, 
"delete": {"query": "QUERY", "commitWithin": "500"}} 
+0

看來IBM濫用JSON RFC。 IBM Bluemix官方教程以這種方式顯示了正在編碼的數據。 – pmuntima

+1

@pmuntima:'SHOULD'是RFC中一個非常具體的術語,參見[RFC 2119](https://tools.ietf.org/html/rfc2119);這意味着'強烈推薦'。因此,當有人偏離時,從技術上講不會違反RFC。 –

相關問題