2016-06-06 3 views

답변

0

RapidJSON는 RFC7159/ECMA-404을 준수 완전히이어야한다가.

아니요, 수동으로해야합니다. 정규식을 사용하여 예를 들어

:

#include <iostream> 
#include <iterator> 
#include <string> 
#include <regex> 

static std::regex value_regex("[\\s]*([\\w\\s]+),?", std::regex::optimize); 

std::string parse(const std::string& value) { 
    if (value.at(0) != '[' || value.at(value.size() - 1) != ']') { 
     throw std::invalid_argument("Error in Parse [must start with '[' and end with ']']: " + value); 
    } 

    std::string result("{"); 
    std::sregex_iterator next(++value.begin(), --value.end(), value_regex, std::regex_constants::match_continuous); 
    std::sregex_iterator end; 
    size_t len = 0, cont = 0; 
    while (next != end) { 
     if (cont) { 
      result.append(", \"").append(std::to_string(cont)).append("\":\"").append(next->str(1)).append(1, '\"'); 
     } else { 
      result.append(1, '\"').append(std::to_string(cont)).append("\":\"").append(next->str(1)).append(1, '\"'); 
     } 
     len += next->length(0); 
     ++next; 
     ++cont; 
    } 

    if (len != value.size() - 2) { 
     throw std::invalid_argument("Error in Parse [" + std::to_string(len) + "]: " + value); 
    } 

    result.append(1, '}'); 
    return result; 
} 

int main() { 
    // Tests 
    try { 
     std::string value("[A,B,C,D,E]"); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::invalid_argument& err) { 
     std::cout << err.what() << std::endl; 
    } 
    try { 
     std::string value("[ A, B X, Z]"); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::invalid_argument& err) { 
     std::cout << err.what() << std::endl; 
    } 
    try { 
     std::string value("[A,BaaayyX, Z]"); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::invalid_argument& err) { 
     std::cout << err.what() << std::endl; 
    } 
    try { 
     std::string value("[A,B,C,]"); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::invalid_argument& err) { 
     std::cout << err.what() << std::endl; 
    } 
    try { 
     std::string value("[]"); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::invalid_argument& err) { 
     std::cout << err.what() << std::endl; 
    } 


    // Errors 
    try { 
     std::string value("A,B,C"); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::invalid_argument& err) { 
     std::cout << err.what() << std::endl; 
    } 

    try { 
     std::string value("A,B,C]"); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::invalid_argument& err) { 
     std::cout << err.what() << std::endl; 
    } 

    try { 
     std::string value("[A,B,C"); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::invalid_argument& err) { 
     std::cout << err.what() << std::endl; 
    } 

    try { 
     std::string value("[,A,B,C]"); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::invalid_argument& err) { 
     std::cout << err.what() << std::endl; 
    } 

    try { 
     std::string value(""); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::exception& err) { 
     std::cout << err.what() << std::endl; 
    } 

    try { 
     std::string value("["); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::exception& err) { 
     std::cout << err.what() << std::endl; 
    } 

    try { 
     std::string value("]"); 
     std::cout << value << " -> " << parse(value) << std::endl; 
    } catch (const std::exception& err) { 
     std::cout << err.what() << std::endl; 
    } 
} 

출력 :

[A,B,C,D,E] -> {"0":"A", "1":"B", "2":"C", "3":"D", "4":"E"} 
[ A, B X, Z] -> {"0":"A", "1":"B X", "2":"Z"} 
[A,BaaayyX, Z] -> {"0":"A", "1":"BaaayyX", "2":"Z"} 
[A,B,C,] -> {"0":"A", "1":"B", "2":"C"} 
[] -> {} 
A,B,C -> Error in Parse [must start with '[' and end with ']']: A,B,C 
A,B,C] -> Error in Parse [must start with '[' and end with ']']: A,B,C] 
[A,B,C -> Error in Parse [must start with '[' and end with ']']: [A,B,C 
[,A,B,C] -> Error in Parse [0]: [,A,B,C] 
    -> basic_string 
[ -> Error in Parse [must start with '[' and end with ']']: [ 
] -> Error in Parse [must start with '[' and end with ']']: ] 

당신은 더 유연 이상의 엄격하게하기 위해 정규식을 사용자 정의 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는이 접근법을 시도 할 것이다. 이전에는 C#에서 JSON 구문 분석 라이브러리를 사용하여 JSON 구문 분석을 허용했습니다 (단일 프로젝트의 경우). 그러나 RFC에 대한 요지가 있으므로이 맞춤 솔루션을 선택할 것입니다. – devilzk83

관련 문제