我有以下方法在逐步遍历json时以递归方式替换所有键和值:
private static void ReplaceKeyValue(IDictionary<string, object> dictionary, dynamic keys)
{
foreach (dynamic item in keys)
{
if (dictionary.ContainsKey(item.Key))
{
dictionary.Add(item.Value, dictionary[item.Key]);
dictionary.Remove(item.Key);
var nextItem = dictionary[item.Value];
Type type = nextItem.GetType();
if (type != typeof(string) && !type.IsPrimitive)
{
if (dictionary[item.Value].Count > 0)
{
ReplaceKeyValue(nextItem, keys);
}
}
}
}
}
代码必须检查nextItem是否有任何子代,然后再次替换所有子代,如果没有,则退出。一旦代码进入json的第二层,我在其中只有几个项只有字符串和整数值,它将进入类型检查步骤,然后出现错误:
$exception {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'string' does not contain a definition for 'Count'
我也尝试检查GenericType和GenericTypeDefinition,但无济于事。请告知最好的检查方法是什么?我缺少简单的东西吗?
编辑:进行澄清。 正如我所说的,我正在循环ovr一个已经被JSON.net反序列化的json对象。我强制转换为IDictionary,因为值类型是未知的并且可以是任何值,因此我需要检查类型并相应地进行处理。如果它有孩子,那么我也需要遍历他们并做同样的事情。这些项目可以深几个级别。
编辑2:
我解决了。
我只需要添加一个步骤来检查ExpandoObject,这样我就不必检查Count并自动将字符串的类型从string转换为String(我认为没有区别?)。这是最后一块:
if (nextItem is ExpandoObject)
{
ReplaceKeyValue(nextItem, keys);
}
else {
Type type = nextItem.GetType();
if (type != typeof(String) && !type.IsPrimitive)
{
if (nextItem.Count > 0)
{
ReplaceKeyValue(nextItem, keys);
}
}
}