2016-08-29 7 views
0

に基づいてJSONオブジェクトを入力:私はフォーマット「/ index1の/ INDEX2/index3の文字列に応じて、オブジェクトを入力しますは、再帰的に、私は次のようなJSONオブジェクト持っている文字列

{ 
    "ESP_IN_PC_OUT":{ 
     "track":{ 
      "1":{ 
       "mute":{ 
        "type":"LED", 
        "pins":[4] 
       } 
      }, 
      "2":{ 
       "mute":{ 
        "type":"LED", 
        "pins":[5] 
       } 
      } 
     } 
    } 
} 

を... "(文字列はOSCメッセージのアドレスです)。例えば、このような「/トラック/ 2 /ミュート」を返すべきであるJSONオブジェクト:

{ 
    "type":"LED", 
    "pins":[5] 
} 

だからタイプ、ピン・アレイ、及び後で実施されるいくつかの他の値にアクセスすることができます。

私はArduino JSON libraryをESP8266で使用しています。これは私が試したコードです:

JSON_OSC_settings2:26: error: use of deleted function 'ArduinoJson::JsonObject& ArduinoJson::JsonObject::operator=(const ArduinoJson::JsonObject&)' 

     tmpJson = tmpJson[tmp]; 

      ^

In file included from C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/include/ArduinoJson.hpp:12:0, 

       from C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/include/ArduinoJson.h:8, 

       from C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/ArduinoJson.h:8, 

       from C:\Users\Pieter\Documents\Arduino\JSON_OSC_settings2\JSON_OSC_settings2.ino:1: 

C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/include/ArduinoJson/JsonObject.hpp:38:7: note: 'ArduinoJson::JsonObject& ArduinoJson::JsonObject::operator=(const ArduinoJson::JsonObject&)' is implicitly deleted because the default definition would be ill-formed: 

class JsonObject : public Internals::JsonPrintable<JsonObject>, 

    ^

In file included from C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/include/ArduinoJson/JsonArray.hpp:13:0, 

       from C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/include/ArduinoJson.hpp:11, 

       from C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/include/ArduinoJson.h:8, 

       from C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/ArduinoJson.h:8, 

       from C:\Users\Pieter\Documents\Arduino\JSON_OSC_settings2\JSON_OSC_settings2.ino:1: 

C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/include/ArduinoJson/Internals/ReferenceType.hpp:32:18: error: 'ArduinoJson::Internals::ReferenceType& ArduinoJson::Internals::ReferenceType::operator=(const ArduinoJson::Internals::ReferenceType&)' is private 

    ReferenceType& operator=(const ReferenceType&); 

       ^

In file included from C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/include/ArduinoJson.hpp:12:0, 

       from C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/include/ArduinoJson.h:8, 

       from C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/ArduinoJson.h:8, 

       from C:\Users\Pieter\Documents\Arduino\JSON_OSC_settings2\JSON_OSC_settings2.ino:1: 

C:\Users\Pieter\Documents\Arduino\libraries\ArduinoJson-master/include/ArduinoJson/JsonObject.hpp:38:7: error: within this context 

class JsonObject : public Internals::JsonPrintable<JsonObject>, 

    ^

exit status 1 
use of deleted function 'ArduinoJson::JsonObject& ArduinoJson::JsonObject::operator=(const ArduinoJson::JsonObject&)' 

どのように私はこの問題を解決することができます。

#include <ArduinoJson.h> 

char *jsonstr = "{\n \"ESP_IN_PC_OUT\":{\n  \"track\":{\n   \"1\":{\n    \"mute\":{\n     \"type\":\"LED\",\n     \"pins\":[4]\n    }\n   },\n   \"2\":{\n    \"mute\":{\n     \"type\":\"LED\",\n     \"pins\":[5]\n    }\n   }\n  }\n },\n\n\n \"ESP_OUT_PC_IN\":{\n  \"analog\":{\n  },\n  \"digital\":{\n   \"16\":\"/track/1/mute\"\n  }\n }\n}"; 

void setup() { 
    Serial.begin(115200); 

    DynamicJsonBuffer jsonBuffer; 

    JsonObject& root = jsonBuffer.parseObject(jsonstr); 
    if (!root.success()) { 
    Serial.println("parseObject() failed"); 
    return; 
    } 

    Serial.println((const char*) root["ESP_IN_PC_OUT"]["track"]["2"]["mute"]["type"]); // prints "LED" 
    Serial.println(); 

    char *address = "/track/2/mute";  // _____Interesting part_____ 
    char *tmp = strtok(address,"/"); 
    JsonObject& tmpJson = root["ESP_IN_PC_OUT"]; 
    bool success = true; 
    while(tmp != NULL && success == true){ 
    Serial.println(tmp); 
    if(tmpJson.containsKey(tmp)){ 
     tmpJson = tmpJson[tmp];  // Error: use of deleted function 'ArduinoJson::JsonObject& ArduinoJson::JsonObject::operator=(const ArduinoJson::JsonObject&)' 
     tmp = strtok(NULL,"/"); 
    } else { 
     success = false; 
    } 
    } 
    if(success == true){ 
    Serial.println((const char*)tmpJson["type"]); 
    } else { 
    Serial.println("Address not found"); 
    } 
} 

void loop() { 
} 

しかし、これは私に次のエラーメッセージが表示されますか?どのようなアプローチをとることができますか?

+0

なぜリファレンスを再定義しようとしていますか? – Sugar

答えて

0

私はCの開発者ではありませんが、あなたはJSONのxPathに相当する»JSONPath«と呼ばれるものを助けるものがあります。おそらくあなたはそれを行うことができるライブラリを見つけることができます。

Thisと同様のようです。あなたは、単に使用することができ、サブオブジェクトを指すために

+0

これは確かに正しいソリューションと思われます、ありがとう!図書館の製作者も私の質問に答えました。[GitHubで](https://github.com/bblanchon/ArduinoJson/issues/343)、ポインタが行く方法です。 – tttapa

+0

あなたの問題を解決するならば、あなたは答えを受け入れるように自由に感じるかもしれません。これはC++の質問に対する私の最初の答えとなります。受け入れられれば、本当の幸運の一種です:) – philipp

+0

@tttapa:あなたの問題を解決すれば、githubからの回答をここで分かち合うことができます。 – mpromonet

0

、:

JsonObject& tmpJson = root["ESP_IN_PC_OUT"]["track"]["2"]["mute"]; 

次のこのサブオブジェクトは、このようなJsonObject::invalidにそれを比較する存在するかどうかをチェックすることができます:

bool success = (tmpJson != JsonObject::invalid()); 

if(success == true){ 
    Serial.println((const char*)tmpJson["type"]); 
} else { 
    Serial.println("Address not found"); 
} 

パスの一部が存在しない場合、operator[]JsonObject::invalidへの参照を返し、その子へのアクセスもJsonObject::invalidへの参照を返します。それで、存在しない子に反復することは安全です。

関連する問題