gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:27:22 25 4
gpt4 key购买 nike

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

例如:

===========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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com