2016-09-03 8 views
2

注:これはWebプログラミング用ではありません。私たちは、javascriptを使用して低レベルのハードウェアとのインターフェイスを作っています。したがって、jQuery APIなどと一緒に行かないでください。javascriptとpythonの両方から同じJSONファイルにアクセスするには?

デバイス上で一連のアクションを実行するjavascriptファイルがあります。これらのアクションを検証します。 javascriptファイルとpythonファイルの両方にハードコードされた一連のハードウェア情報があります。これらの情報をJSONファイルに入れて両方の情報にアクセスできるようにして、この情報の重複を避けたいと思います。 'hardware.json' は...

をJavaScriptシンタックスを使用していないので、すでにこの段階で失敗した

// Javascript 
var hardware_info = JSON.parse(load('hardware.json')); 
// load() is probably not standard javascript API, but it basically copies that code into the existing script. 

私はすでにjshint/jslintを使用してJSONを検証し、hardware.jsonは次のようになります。

{ 
    "hardware1": { 
     "ID": "xxx" 
    }, 
    "hardware2": { 
     "ID": "yyy" 
    } 
} 

次のPythonはjsonにアクセスするためにうまくいきます。それほど多くはありません。

with open('hardware.json', 'r') as f: 
    data = json.load(f) 
+0

JSONファイルをJavaScriptのように読み込むことは望ましくありません。文字列として読み取って 'JSON.parse()'に渡す必要があります。 (または、JSONをファイルから解析する関数を使用してください) – Biffen

+2

'load()'はどこから来たのですか? 'load()' *がロードされたファイルを実行して何も返さないことがありますか? –

+0

'load()'がデータを実行する場合、代わりにJSONPとしてデータをフォーマットすることができます(PythonでロードするときにファイルからJSONP関数呼び出しを取り除く必要があります)。 –

答えて

2

load()は、指定されたファイルを実行し、それを読み取って内容を返しません。 別のファイルを読み取るオプションがある場合は、JSONの代わりにJSONPを使用することをおすすめします。

JSONPは、コールバックをデータの周りに追加して動作します。代わりに:

{"key": "value"} 

ファイルは、渡されるデータを持つ関数呼び出しが含まれています

callback({"key": "value"}); 

これは、それがコールバックを実行させる、JavaScriptエンジンによって実行されることを意図しています。 load()があなたのファイルを実行し、結果としてコールバック関数が呼び出され、データが渡されます。

JSONPサービスを呼び出してサービスが追加するコールバックの名前を渡しますが、JSエンジンとPythonの間で設定ファイルを共有するだけでは、そのコールバックをハードコードします名。

Pythonでは、JSONデータとして読み込む前にコールバックテキストを削除する必要があります。それはちょうど最初のNと最後のM文字を削除するのと同じくらい簡単かもしれない:

with open('hardware.json', 'r') as f: 
    jsonp_data = f.read() 
    # remove first 9 and last 3 characters to remove JSONP callback 
    data = json.loads(jsonp_data[9:-3]) 

もう少し洗練された技術では、改行を使用できます。それは簡単に最初と最後の行を削除できるようにすること

callback(
{"key": "value"} 
); 

をPythonで。または、jsonp_data.partition('(')[-1].jsonp.rpartition(')')[0]を使用して、文字列内の最初の(と最後の)文字の間のすべてを取ることができます。等

関連する問題