2016-10-03 3 views
0

Python 2.7からjsonライブラリを使用してJSONオブジェクトを作成しようとしています。私は次のようにシリアル化するために必要なパラメータを持つクラスを作成しています:JSONシリアライズ可能クラスの動的パラメータ

class DataMessage: 
    channelID = 0 
    messageID = 0 
    timestamp = 0 
    voltageRMS = 0 
    currentRMS = 0 
    voltageDC = [] 
    currentDC = [] 


しかし、JSONにそれをシリアル化するとき、私はchannelIDに関する変更するパラメータの名前を必要とします。私はシリアル化されたパラメータ(channelID)の一部を除外しますまたは動的にparams(voltageDC[])の配列を作成するには、このライブラリー内のすべての機能を見つけることができませんでした

{ 
    "messageID" = id, 
    "timestamp" = 32432, 
    "voltageRMS1" = 548, 
    "currentRMS1" = 5548, 
    "voltageDC1_1" = 43, 
    "voltageDC1_2" = 44, 
    "voltageDC1_3" = 45, 
    # .... 
    "currentDC1_1" = 32, 
    # .... 
} 

:channelID = 1つのデータは以下のようにシリアル化する必要があるとき:例えばのために。

ので、JSONシリアライズされたメッセージの詳細:

  1. voltageRMS1は - channelID = 1
  2. voltageDC[]配列がvoltageDC_1 = ...
  3. channelID内の各値のために拡大することを意味するだけで、シリアライズされません。パラメータ名を考慮したものです。
+1

いいえ、これはまったく専門的であるため、これを正確に行う機能はありません。これらのキーで辞書を生成するだけです。キーは文字列なので、ルールに従って作成するのは簡単です。 –

+1

あなたのスキルを向上させるために、何かを自分で書くようにしてください。あなたが失敗する場合は、私たちに知らせてください、あなたが行った/見つけたものを貼り付けてください。 – turkus

答えて

1

あなたは、各配列をアンパックあなたのクラスのカスタムJSONEncoderを実装する必要があります:

from json import JSONEncoder 

class MyEncoder(JSONEncoder): 
    def default(self, o): 
     result = { 
      'messageID': o.messageID, 
      ... 
     } 

     for n, item in enumerate(o.voltageDC): 
      result['voltageDC{}_{}'.format(o.channelID, n)] = item 

     # and so on... 

     return result 

あなたはその後、JSON出力を得るためにあなたのカスタムエンコーダクラスとjson.dumps()を呼び出すことができます。

dm = DataMessage() 
... 
json.dumps(dm, cls=MyEncoder) 
関連する問題