.net - 如何将具有分层键的字典反序列化为动态对象?

标签 .net dynamicobject

我正在接收字典形式的数据,并想将其反序列化为动态对象。不同之处在于字典键表示分层对象。第二个转折是一些键表示数组和/或字典属性。

例如:

===========Key================ ======Value========
Person.First                  | John
Person.Last                   | Doe
Person.Phone[Work]            | 999-555-1234
Person.Phone[Home]            | 999-555-1235
Person.Addresses[Home].Street | 101 My Street
Person.Addresses[Home].City   | AnyTown
Person.Spouse.First           | Jane
Person.Spouse.Last            | Doe
Person.Insurance[0].Name      | Medicare
Person.Insurance[0].GroupNum  | 1234567

编辑:添加数组示例

我试图找到一种简单的方法来创建一个对象,然后可以在运行时表达式计算器中使用该对象。

这是我的第一次尝试,适用于简单属性,但不尝试处理数组

public static class DynamicBuilder
{
    public static object Build(IDictionary<string, object> dict)
    {

        ExpandoObject root = new ExpandoObject();

        foreach (var item in dict)
        {
            var objDict = (IDictionary<string, object>)root;

            var parts = item.Key.Split('.');

            for (int i = 0; i < parts.Length ; i++)
            {
                string propName = parts[i];

                if (i < parts.Length - 1)
                {
                    if (!objDict.ContainsKey(propName))
                    {
                        dynamic temp = new ExpandoObject();
                        objDict.Add(propName, temp);
                        objDict = (IDictionary<string, object>)temp;
                    }
                    else
                    {
                        objDict = (IDictionary<string, object>)objDict[propName];
                    }

                }
                else
                {
                    if (objDict.ContainsKey(propName))
                        objDict[propName] = item.Value;
                    else
                        objDict.Add(propName, item.Value);

                }

            }

        }

        return root;
    }

}

关于解决这个问题的更好方法有什么想法吗?

谢谢,

最佳答案

一个简单的方法就是制作一个像

这样的自定义对象
public class DictObject
{
   public String value;
   public Dictionary<string, DictObject> children;
}

您的主字典只是一个 Dictionary<string, DictObject> 对象。对于每个属性名称,您将添加一个字典条目和一个值,或者为子项添加一个子字典。

所以你会加载 Person.First 以便它像

 MainDict("Person").children("First").Value 

使用这种方法,您也可以像 . 子项一样简单地表示您的字典和数组条目,而不是对它们进行特殊处理。像这样可视化您的数据,

===========Key================ ======Value========
Person.First                  | John
Person.Last                   | Doe
Person.Phone.Work             | 999-555-1234
Person.Phone.Home             | 999-555-1235
Person.Addresses.Home.Street  | 101 My Street
Person.Addresses.Home.City    | AnyTown
Person.Spouse.First           | Jane
Person.Spouse.Last            | Doe
Person.Insurance.0.Name       | Medicare
Person.Insurance.0.GroupNum   | 1234567

所以这些值可以像这样访问,

 MainDict("Person").children("Insurance").children("0").children("Name").Value 

如果您想再次输出相同的文本文件,如果您想跟踪字典/数组,您总是可以向 DictObject 添加属性。

关于.net - 如何将具有分层键的字典反序列化为动态对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201053/

相关文章:

.net - 适用于 Visual Studio 2008 的 Crystal Reports 合并模块

c# - .NET 中的透明控件

javascript - 获取 javascript 值到 C# 字符串

c# - XML-RPC.NET 和 C# 动态类型

c# - 同一命名空间中的 "Dynamic object does not contain a definition"错误

c# - DynamicObject - 根据参数值调用方法

c# - 无法为 ExpandoObject 赋值

.net - 我可以在 Word 或 Excel 中创建撤消事务吗? (VSTO)

wpf - ICustomTypeProvider 或 DynamicObject

c# - DotNetOpenId — “This message has already been processed” 错误(第 2 部分)