rapidJson問題記錄

2021-10-03 19:30:57 字數 3497 閱讀 7073

...

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...