當前位置:成語大全網 - 書法字典 - C#對JSON的反序列化收到多個結構

C#對JSON的反序列化收到多個結構

當JavaSerializer反序列化類型未知的對象時,每個屬性的值只能是以下兩種類型之壹:dictionary

另外,我寫了壹個簡單的輔助類,應該可以省去妳壹層壹層foreach的麻煩。輔助類做了壹點優化,字典和數組分開處理,不再需要遍歷字典的鍵。

使用時只需填寫要訪問的屬性的“完整路徑”,數組成員使用【】的形式。如果指向不存在的屬性,則返回null。

示例varresult = nontypeobjectreader。getvalue(obj,“prop。兒童【0】。內螺旋槳“

班級?非類型對象閱讀器

{

公共的?靜電?對象?GetValue(對象?obj,?弦樂?表情)

{

var?堆棧?=?GetExpQueue(表達式);

如果?(堆棧。數數?& gt?0)

{

回歸?GetValueInner(obj,?棧);

}

回歸?null

}

私人?靜電?對象?GetValueInner(object?obj,?隊列& lt元組& lt字符串,?bool & gt& gt?堆棧)

{

如果?(堆棧。數數?& gt?0)

{

var?圖普。=?堆棧。dequeue();

如果?(!圖普。第2項)

{

var?dictObj?=?obj?作為什麽?字典& lt字符串,?對象& gt;

如果?(dictObj?!=?null?& amp& amp?字典對象。包含密鑰(tup。Item1))

{

回歸?GetValueInner(dict obj【tup。Item1】,?棧);

}

}

不然呢?如果?(!(obj?是嗎?字典& lt字符串,?對象& gt))

{

var?指數?=?裏面的解析(tup。item 1);

var?arrObj?=?obj?作為什麽?數組;

如果?(arrObj?!=?null?& amp& amp?arrObj。長度?& gt?索引)

{

回歸?GetValueInner(arr obj。GetValue(索引),?棧);

}

}

回歸?null

}

回歸?obj

}

私人?靜電?隊列& lt元組& lt字符串,?bool & gt& gt?GetExpQueue(string?表情)

{

var?rtnStack?=?新的?隊列& lt元組& lt字符串,?bool & gt& gt();

StringBuilder?propName?=?新的?StringBuilder();

var?nextSaveIsIndex?=?假的;

為了什麽?(var?光標?=?0;?光標?& lt?表情。長度;?光標++)

{

var?ch?=?表達式【光標】;

如果?(ch?!=?'.'?& amp& amp?ch?!=?'['?& amp& amp?ch?!=?']')

{

propName。追加(ch);

}

不然呢?如果?(propName。長度?& gt?0)

{

rtnStack。入隊(新?元組& lt字符串,?bool & gt(propName。ToString(),?nextSaveIsIndex));

propName。clear();

nextSaveIsIndex?=?ch?==?'[';

}

}

如果?(propName。長度?& gt?0)

{

rtnStack。入隊(新?元組& lt字符串,?bool & gt(propName。ToString(),?false);

}

回歸?rtnStack

}

}測試代碼:

var?串行器?=?新的?JavaScript serializer();

var?rawObj?=?新的

{

Prop1?=?1,

Prop2?=?“妳好”,

孩子?=?新【】

{

新的

{

InnerProp?=?"1",

Sub?=?新的?object【】{“string“,2016}

},

新的?

{

inner prop =“2“,

Sub?=?新的?對象【】{日期時間。現在2.5}

}

}

};

var?jsonStr?=?序列化程序。serialize(raw obj);

var?obj?=?序列化程序。反序列化對象(jsonStr);

var?價值?=?NonTypeObjectReader。GetValue(obj,“孩子【0】。sub【1】“;

調試。斷言(值?是嗎?int?& amp& amp?(int)值?==?2016);