作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 C# 中,我有一个扁平的 Dictionary<string, string>
,其中键是 obj1/obj2/obj3
的形式,值是直接字符串。现在我想将其序列化为子对象,因此示例值:
var dict = new Dictionary<string, string> { {"foo/bar/baz1", "123" }, {"foo/baz", "456" }, { "foo/abc", "def" } };
{
"foo": {
"bar": {
"baz1": "123"
},
"baz": "456",
"abc": "def"
}
}
最佳答案
您可以使用 JObject
方法将源字典解析为 JObject.FromObject
。然后遍历所有属性,使用 string.Split
拆分它们并递归解析为新的 JObject
,表示属性树。最后使用 JObject.Add
将此对象添加到目标对象,或者如果给定的键已存在则更新它
var dict = new Dictionary<string, string> { { "foo/bar/baz1", "123" }, { "foo/baz", "456" }, { "foo/abc", "def" } };
var source = JObject.FromObject(dict);
var dest = new JObject();
foreach (var property in source.Properties())
{
//split the name into parts
var items = property.Name.Split(new[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
var item = items.FirstOrDefault();
if (string.IsNullOrEmpty(item))
continue;
//get JObject representing a properties tree
var result = WriteItems(items.Skip(1).ToList(), property.Value);
//check that destination already contains top property name (e.g. 'foo')
if (dest.ContainsKey(item))
{
(dest[item] as JObject)?.Add(result.First);
}
else
{
dest.Add(item, result);
}
}
Console.WriteLine(dest.ToString());
//local function to recursively go through all properties and create a result JObject
JObject WriteItems(IList<string> items, JToken value)
{
var item = items.FirstOrDefault();
items.RemoveAt(0);
if (!items.Any()) //no more items in keys, add the value
return new JObject(new JProperty(item, value));
return new JObject(new JProperty(item, WriteItems(items, value)));
}
{
"foo": {
"bar": {
"baz1": "123"
},
"baz": "456",
"abc": "def"
}
}
foo/bar/baz1
之类的结构序列化为
Json.NET
中的子对象
关于c# - 将平面字典序列化为多子对象 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60692733/
对于以下多子脚本: multi sub Screen_get_valid_string($prompt, $accept_empty_string, $max_length = 999) { retu
我正在开发 open-source, cross-platform具有统计支持的番茄计时器。 对于任务,我有一个像这样的树数据结构: class Task { String name;
我是一名优秀的程序员,十分优秀!