另外,我寫了壹個簡單的輔助類,應該可以省去妳壹層壹層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);