2016-08-29 4 views
0

을 기반으로 JSON 객체를 입력 나는 다음과 같은 JSON 객체있어 :재귀 문자열

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

나는 형식 "/ index1의/index2/INDEX3의 문자열에 따라 개체를 입력 할을 ... "(문자열은 OSC 메시지의 주소입니다.) 예를 들어, 이와 같은 "/ 트랙/2/뮤트"반환해야 JSON 오브젝트 :

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

그래서 타입, 핀 배열 및 나중에 구현 될 다른 어떤 값에 액세스 할 수있다.

저는 Arduino JSON library을 ESP8266에 사용하고 있습니다. 이 나에게 다음과 같은 오류 메시지를 제공하지만

#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() { 
} 

: 이것은 내가 해봤 코드입니다

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&)' 

나는이 문제를 해결 할 수 있습니까? 어떤 다른 접근 방식을 취할 수 있습니까?

+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::invalid과 비교 존재하는 경우

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

다음을 확인할 수 있습니다

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에 대한 참조를 반환하므로 존재하지 않는 자식을 반복하는 것이 안전합니다.