3

我正在以字典形式接收数据,并希望将其反序列化为动态对象。扭曲是字典键表示分层对象。第二个转折点是一些键表示数组和/或字典属性。

例如:

===========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;
    }

}

关于更好的方法来解决这个问题的任何想法?

谢谢,

4

1 回答 1

0

一种简单的方法就是制作一个自定义对象,例如

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如果您想再次输出相同的文本文件,您可以随时添加属性来跟踪字典/数组。

于 2012-05-17T16:13:56.307 回答