2017-08-24 16 views
0

jsonに変換する文字列があります。Pythonのパース文字列が置換えが機能しない

文字列は以下の通りである:

s='{\\'kind\\': 1, \\'topic\\': \\'manufacturing_device\\', \\'message_type\\': 1, \\'txid\\': \\'6bcc6212a8\\', \\'name\\': \\'manufacturing\\'}' 

私はJSON形式のダンプとロードを使用し、

jStr = json.dumps(s) 
loadStr = json.loads(jStr) 

は、その後、私はloadStrにアクセスする必要が働いていない[ '話題']、それは私にエラー「の文字列を与えますインデックスは、整数

でなければならないそれから私は多分私は"\\" 。したがって、私はs.replace('\\\'', '\"')を行なったし、どちらか動作しませんでした置き換える必要があると思う。

私が間違っていたことはありますか?ところで、私はPythonを使用します。

+1

's'はJSONではなく、この文は有効なPythonではありません。 [mcve]を作成してください。あなたの実際のコードが有効であるとすれば、 'jStr = json.dumps(s)'は 's'の文字列値のJSON表現を生成するので、' json.loads(jStr) 'はそれから同じ文字列をデコードしますあなたの後にある辞書の代わりにJSONを使用します。 –

答えて

0

あなたはsが適切な辞書である場合は、jsonjson文字列を作成することができ、この

import ast 
s='{\'kind\': 1, \'topic\': \'manufacturing_device\', \'message_type\': 1, \'txid\': \'6bcc6212a8\', \'name\': \'manufacturing\'}' 

ne = ast.literal_eval(s) 
print(type(ne)) 
print(ne['topic']) 

出力

<class 'dict'> 
manufacturing_device 
+0

偉大な、それは、ありがとう、たくさん働いて – movingcloud

+0

'ne = ast.literal_eval(s)'だけでなく、ダブル 'ダンプ'をスキップしてみませんか? – hpaulj

+0

@hpauljインポートjson インポートast s '' \ 'kind \':1、\ 'トピック\':\ '製造用デバイス\'、\ 'メッセージタイプ\':1、\ 'txid \':\ '6bcc6212a8 \ '\ '名\:製造' \ '\'}' JSTR = json.dumps(S) をnewText =評価(json.dumps(JSTR)) NE = ast.literal_evalを(をnewText) 印刷(タイプ(ne))。返すタイプstr –

0

loadStrは文字列なのでエラーです。したがって、文字列にgetitemを使用することはできません。

0

Pythonオブジェクトではなく、文字列をjsonにパックするだけです。

それではあなたは

loadStr = json.loads(jStr) 

この行にキーで値を取得しようとしているあなたが戻ってこの文字列を取得します。ところで

import json 
s='{"kind": 1, "topic": "manufacturing_device", "message_type": 1, "txid": "6bcc6212a8", "name": "manufacturing"}' 
load_str = json.loads(s) 
print(load_str['kind']) 

、あなたはPythonの文字列を扱うとき、それは同じ引用符をエスケープしないようにするために、単一引用符と二重引用符を使用するように簡単です:

だから私はあなたがこのようなものが必要だと思います。

s='{"kind": 1, "topic": "manufacturing_device", "message_type": 1, "txid": "6bcc6212a8", "name": "manufacturing"}' 
0

のようなものを使用することができます。

In [1194]: s={'kind': 1, 'topic': 'manufacturing_device', 'message_type': 1, 'txid': '6bcc6212a8', 'name': 'manufacturing'} 
In [1195]: s 
Out[1195]: 
{'kind': 1, 
'message_type': 1, 
'name': 'manufacturing', 
'topic': 'manufacturing_device', 
'txid': '6bcc6212a8'} 

In [1196]: astr = json.dumps(s) 
In [1197]: astr 
Out[1197]: '{"name": "manufacturing", "txid": "6bcc6212a8", "topic": "manufacturing_device", "message_type": 1, "kind": 1}' 

sは辞書です。 astrは文字列です。

loadsとの往復を完了します。

In [1198]: s1 = json.loads(astr) 
In [1199]: s1 
Out[1199]: 
{'kind': 1, 
'message_type': 1, 
'name': 'manufacturing', 
'topic': 'manufacturing_device', 
'txid': '6bcc6212a8'} 
0

sが適切な辞書である場合は、jsonjson文字列を作成することができます

In [1194]: s={'kind': 1, 'topic': 'manufacturing_device', 'message_type': 1, 'txid': '6bcc6212a8', 'name': 'manufacturing'} 
In [1195]: s 
Out[1195]: 
{'kind': 1, 
'message_type': 1, 
'name': 'manufacturing', 
'topic': 'manufacturing_device', 
'txid': '6bcc6212a8'} 

In [1196]: astr = json.dumps(s) 
In [1197]: astr 
Out[1197]: '{"name": "manufacturing", "txid": "6bcc6212a8", "topic": "manufacturing_device", "message_type": 1, "kind": 1}' 

sが辞書であることを。 astrは文字列です。

コンプリートloadsとの往復:

In [1205]: s1['topic'] 
Out[1205]: 'manufacturing_device' 

(受け入れ答えに私のコメントに関連する編集)

:辞書の要素にアクセスする

In [1198]: s1 = json.loads(astr) 
In [1199]: s1 
Out[1199]: 
{'kind': 1, 
'message_type': 1, 
'name': 'manufacturing', 
'topic': 'manufacturing_device', 
'txid': '6bcc6212a8'} 

は単なる標準のPythonです

この式は、文字列を作成します。

一つ以上の json.dumpsでそれをラップしてから loadsまたは evalとアンラップする必要はありません

In [1216]: ne = ast.literal_eval(s) 
In [1217]: ne 
Out[1217]: 
{'kind': 1, 
'message_type': 1, 
'name': 'manufacturing', 
'topic': 'manufacturing_device', 
'txid': '6bcc6212a8'} 

In [1214]: s='{\'kind\': 1, \'topic\': \'manufacturing_device\', \'message_type\': 1, \'txid\': \'6bcc6212a8\', \'name\': \'manufacturing\'}' 
In [1215]: s 
Out[1215]: "{'kind': 1, 'topic': 'manufacturing_device', 'message_type': 1, 'txid': '6bcc6212a8', 'name': 'manufacturing'}" 

それはliteral_evalを評価し、辞書を作成することができ、有効なPython式、です。

+0

提案に感謝しました –

関連する問題