2012-10-20 2 views
0

JSON 배열에서 데이터를 추출하려면 '[[[1,2,3]], [[1,2,3], [1,2,3] 3]], "string"] '을 입력하십시오. 논리적으로 그것은 [[[x-values]], [[y1-values], [y2-values]], "comments"] '입니다.외부 라이브러리가없고 Qt4의 특정 형식 json 배열을 구문 분석하십시오.

편집 : x, y1, y2 배열은 최대 1000 개 이상의 요소가 될 수 있습니다.

정확한 형식 (작은 따옴표 제외)이 있으며 변경되지 않을 것임을 알고 있습니다.

내가 정말로 원하는 것은 QVector xval, y1val; .

어떻게 해석하나요?

(나는 명백한 누락 그래서 만약 용서해주십시오 QT를 처음입니다.)

+0

형식이 변경되지 않을 것이라고 결코 생각하지 않습니다. JSON 구조는 결코 변경 될 수 없지만 서식이 변경 될 수 있습니다. 임대시 JSON에서 완전히 합법적 인 토큰 사이에 공백을 준비하십시오. –

+0

그것이 의미하는 바는 전체 앱이 해당 문자열을 구문 분석하는 것입니다. 즉, 다른 쪽에서 변경 사항을 도입해야한다면, 상관없이 코드를 조정해야합니다. 나는 후속 쿼리 사이에 차이가 없을 것이라고 말하고 싶다. – McEnroe

답변

1

신속하고 더러운 솔루션 :

QString s = "[[[1,2,3]],[[4,5,6],[7,8,9]],\"string\"]"; 
QStringList parts = s.remove("[").remove("]").split(','); 

QVector<int> xval, yval; 
if (parts.size() >= 6) 
{ 
    xval << parts[0].toInt() << parts[1].toInt() << parts[2].toInt(); 
    yval << parts[3].toInt() << parts[4].toInt() << parts[5].toInt(); 
} 

편집이 : 이제 가변 길이 배열을 지원 :

QVector<int> ToIntList(const QString& s) 
{ 
    QVector<int> result; 
    QStringList parts = s.trimmed().split(","); 
    for (int i = 0; i < parts.size(); ++i) 
     result << parts[i].toInt(); 
    return result; 
} 

QString s = "[[[1,2,3,4,5,6, 7, 8]],[[9\n,10], [11,12,13]],\"string\"]"; 
QStringList lists = s.remove(" ").split("],["); 

for (int i = 0; i < lists.size(); ++i) 
    lists[i] = lists[i].remove("[").remove("]"); 

QVector<int> xval, yval; 
if (lists.size() >= 2) 
{ 
    xval = ToIntList(lists[0]); 
    yval = ToIntList(lists[1]); 
} 
+0

미안하지만, 내가 쓴 것은 약간 모호한 것 같아. 배열이 문자 그대로 세 요소는 아니지만 임의의 길이를 가질 수 있다는 것을 반영하기 위해 제 질문을 편집했습니다. – McEnroe

+0

정확히 내가 원했던 것을합니까! 고맙습니다. – McEnroe