0

Jansson ライブラリを使用して JSON 文字列を生成する C プログラムがあります。次に、文字列は ZMQ ソケットを介して Python リスナーに送信されます。Python リスナーは、jsonライブラリを使用して JSON 文字列をデコードしようとします。送信中に引用記号が台無しになっていると思われるため、JSON デコードに問題があります。

C では、次の JSON オブジェクトを生成します。

{"ティッカー":"GOOG"}

次のコードで strcpy(jsonStrArr, "{\"ticker\":\"GOOG\"}\0");

Python では、次のコードで受け取ったものを出力します。 print 'Received ' + repr(rxStr) +' on Queue_B'

私が見ている印刷物は次のとおりです。

Queue_B で「{u'ticker': u'GOOG'}」を受け取りました

私は JSON の専門家ではありませんが、二重引用符が必要なため、u'が json.loads() 関数を台無しにしていると思います。

jsonStrArr変数に何かを追加する必要があることはわかっていますが、何がわかりませんか?

前もって感謝します。

4

1 に答える 1

1

いいえ、u は何も台無しにしていません。

u'string' は、Unicode 文字列であることを示します。

これをpython 2で実行します

# -*- coding: utf-8 -*-

a = '؏' # It's just some arabic character I googled for, definitely not ascii
b = u'؏' 

print type(a)
>>> <type 'str'>
print type(b)
>>> <type 'unicode'>

したがって、json オブジェクトは完全に有効です。

<type 'str'>私の例の出力は、 Python 3 の両方の文字列に対するものになることに注意してください。

編集:投稿にある出力で json.loads を試しても、実際には機能しません。

Python 2.7 で json コードを印刷すると {"ticker":"GOOG"} が {u'ticker': u'GOOG'} に変更されることがわかりましたが、これは単なる表現であり、まだ有効な json です。

json を適切に出力するには、 json.dumps関数を使用する必要があります。したがって、 repr(rxStr) を json.dumps(rxStr) に置き換えます

import json

a = json.loads(u'{"ticker": "GOOG"}')

print a
>>> "{u'ticker': u'GOOG'}"
print json.dumps(a)
>>> {"ticker": "GOOG"}

繰り返しますが、Python 3 では文字列を印刷する際の動作が異なります。正しく思い出せば、Python 3 の文字列は自動的に Unicode 文字列になるからです。

于 2013-10-19T23:57:37.190 に答える