...
value subservesobj
(kobjecttype)
;subservesobj = sublistobj[
"reserves"];
...//sublistobj是document的某乙個節點;
//如果進行了上述賦值操作,則document中的"reserves"欄位的value將為null。
char szname[64]
;char szage[64]
; value name
(kstringtype)
;name.
setstring
(szname,
strlen
(szname));
subobject.
addmember
("name"
, name, allocator)
;value age
(kstringtype)
;age.
setstring
(szage,
strlen
(szage));
subobject.
addmember
("age"
, name, allocator)
;//注意此處
//value name(kstringtype)被add之後,不能再次被addmember;
//如果再次被addmember,age對應的value為空。
內部 -
> 我 -
> 外部
如果以上json報文到我們的地方需要相容字段,不要在原來的json上面進行remove刪除,再addmember的操作,容易出現問題。
正確的操作方式是:重新建立乙個document,將接收到的json報文進行解析,再將解析到的字段addmember或pushback到新document裡。
document doc;
doc.
setobject()
;document::allocatortype& allocator = doc.
getallocator()
;//strrcvjson為乙個陣列型別的json
document document
document.
parse
(strrcvjson.
c_str()
);if(document.
hasparseerror()
)if(!document.
isarray()
)value sendrcvjsonarr
(karraytype)
;for
(auto
&subobj : document.
getarray()
)if(subobj.
hasmember
("ids"
)&& subobj[
"ids"].
isarray()
)if(subobj.
hasmember
("stringid"
)&& subobj[
"stringid"].
isstring()
)/*對於陣列型別的value也可以這樣解析新增,就是麻煩一點*/
if(subobj.
hasmember
("datalist"
)&& subobj[
"datalist"].
isarray()
) sendrcvjsonobj.
addmember
("datalist"
, senddataarr, allocator)
;}
sendrcvjsonarr.
pushback
(sendrcvjsonobj,allocator);}
doc.
addmember
("sendjson"
, sendrcvjsonarr, allocator)
;stringbuffer strbuffer;
writer
writer
(strbuffer)
;doc.
accept
(writer)
; string pcbuf = strbuffer.
getstring()
;
這種情況要注意一下待新增的document的生命週期問題,區域性變數釋放了就有問題了,到最後doc.accept(writer)會core掉。
在上文中我們提到過,rapidjson進行賦值操作,原節點value將變為空,有時我們不希望源原節點變為null,還需要用到原節點。
比如判斷原節點的某些欄位的值(過濾),再決定是否要將原節點新增到新的document,這時我們需要用到深拷貝。
rapidjson的move語意,
示例:
rapidjson::value a
(123);
rapidjson::value b
(456);
b = a;
// a變成null,b變成數字123,這樣的做法是基於效能考慮
除了上述示例的複製語句外,addmember()和pushback()也採用了move語意。深複製value:
value v1
("foo");
// value v2(v1); // 不容許
value v2
(v1, a)
;// 製造乙個轉殖,v1不變
document d;
v2.copyfrom
(d, a)
;// 把整個document複製至v2,d不變
rapidjson為了最大化效能,大量使用了淺拷貝,使用之前一定要了解清楚。如果採用了淺拷貝,特別要注意區域性物件的使用,以防止物件已被析構了,卻還在被使用。
注:1、當然,如果不用深複製,也可以暴力去解析此節點,再新增到新document。
2、如果僅僅是匹配字段,最好的方式是直接傳引用,也不用深拷貝了,這個就看具體的場景了。
//傳引用
value &subobj = sublistobj[
"object"];
//深拷貝
document doc;
//無特殊意義,用於reserves欄位的深拷貝,為其提供記憶體分配器
document::allocatortype& allocator = doc.
getallocator()
;value subobj
(sublistobj[
"object"
], allocator)
ios crash問題記錄
1.誤將nsmutablearray型別的變數初始化為nsarray,結果對nsmutablearray型別變數進行操作時,crash h檔案如下 inte ce movemecontroller secondlevelviewcontroller property nonatomic,retain...
??? nginx lua問題記錄
問題1 當用http localhost test 訪問時,結果為何迥異?eg1 location test 結果為空,說明執行的是httpechomodule的echo指令,沒有執行httpluamodule的content by lua指令 eg2 location test輸出123 說明執行...
sphinx 問題記錄
indexer error while loading shared libraries libmysqlclient.so.18 cannot open shared object file no such file or directory 發現sphinx indexer依賴庫ibmysqlc...