2013-10-09 2 views
1

기존 JSON 파일을 읽고 수정하고 (예 : 객체, 배열 및 키 - 값 쌍을 대체, 제거 및 추가) 파일을 다시 쓸 수 있어야합니다. .Qt JSON 파일을 수정하는 중

{ 
    "array": [ 
     { 
      "name": "Channel", 
      "default": 1 

     }, 
     { 
      "name": "Size", 
      "default": 457 
     } 
    ] 
} 

내가 성공적으로 파일을 읽는하지만, 다음 코드를 사용하여를 변경할 실패하고있다 :

나는 읽고이 내용과 JSON 파일에 쓰기를 시도하고있다

QFile File("/path/to/myfile.json"); 
File.open(QIODevice::ReadOnly | QIODevice::Text); 

QJsonParseError JsonParseError; 
QJsonDocument JsonDocument = QJsonDocument::fromJson(File.readAll(), &JsonParseError); 

File.close(); 

QJsonObject RootObject = JsonDocument.object(); 
QJsonArray Array = RootObject.value("array").toArray(); 

QJsonObject ElementOneObject = Array.at(0).toObject(); 

ElementOneObject.insert("key", QJsonValue(QString("value"))); 
ElementOneObject.insert("name", QJsonValue(QString("David"))); 

File.open(QFile::WriteOnly | QFile::Text | QFile::Truncate); 
File.write(JsonDocument.toJson()); 
File.close(); 

배열의 첫 번째 요소에 새로운 이름이 "David"이고 "key" : "value"과 같은 새 키 - 값 쌍이 표시 될 것으로 예상됩니다. 이 코드가 실행 된 후 파일 내용이 동일합니다. 키 - 값 쌍의 순서가 알파벳 순서로 정렬 된 키에 의해 정렬되도록 변경 되었기 때문에 파일이 기록되었다는 것을 알고 있습니다.

내가 변경하려고 시도한 변경 사항을 파일에 어떻게 반영합니까?

답변

5

이유의 예제가 작동하지 않는 이유는 JsonDocument.object(), RootObject.value("array").toArray()Array.at(0).toObject()이 모두 참조 데이터가 아닌 복사본을 반환하기 때문입니다. 이를 처리하는 데는 두 가지 다른 방법이 있습니다. 당신이 당신의 배열의 복사본에 삽입 요소로 변경 한 후, 다음 RootObject 사본에 배열을 삽입

1), 다음 JsonDocument

Array.removeAt(0); 
Array.insert(0, ElementOneObject); 
RootObject.insert("array", Array); 
JsonDocument.setObject(RootObject); 

2) find() 사용에 RootObject을 설정

QJsonObject RootObject = JsonDocument.object(); 
QJsonValueRef ArrayRef = RootObject.find("array").value(); 
QJsonArray Array = ArrayRef.toArray(); 

QJsonArray::iterator ArrayIterator = Array.begin(); 
QJsonValueRef ElementOneValueRef = ArrayIterator[0]; 

QJsonObject ElementOneObject = ElementOneValueRef.toObject(); 

// Make modifications to ElementOneObject 

ElementOneValueRef = ElementOneObject; 
ArrayRef = Array; 
JsonDocument.setObject(RootObject); 
1

파일에서 Json 문서를 만든 다음 첫 번째 (루트) 항목 인 RootObject를 가져옵니다. 이것은 JsonDocument의 루트 항목에 대한 참조가 아니라 복사본입니다.

따라서 수정 된 루트 항목에서 새 JsonDocument를 만들고 저장하십시오.

QJsonDocument doc(RootObject); 

File.open(QFile::WriteOnly | QFile::Text | QFile::Truncate); 
File.write(doc.toJson()); 
File.close(); 

또는 당신이 처음 만든 QJsonDocument로 다시 루트 개체를 설정할 수 있습니다이 기능이있다 : -

void QJsonDocument::setObject(const QJsonObject & object) 

그래서 저장하기 전에 호출 시도는

JsonDocument.setObject(RootObject); 
+0

이전에 setObject()를 시도했지만 충분하지 않았습니다. 문제는 RootObject가 복사본이라는 것입니다. 그러면 Array이고 또한 복사본입니다. 그런 다음 해당 배열에서 요소를 가져옵니다.이 배열은 복사본입니다. 나는 이것을 마지막에 수행하면 작동한다. Array.takeAt (0); Array.insert (0, ElementOneObject); RootObject.insert ("array", Array); JsonDocument.setObject (RootObject); 이것은 약간 정신 나간 것 같습니다! – oggmonster

+0

루트 객체를 얻으면 find 함수를 사용하면 키의 실제 데이터에 대한 반복자를 반환합니다. 이렇게하면 끝에 setObject를 호출하기 전에 데이터를 직접 변경할 수 있습니다. – TheDarkKnight

관련 문제