【发布时间】:2020-02-28 21:59:55
【问题描述】:
我有一本这样的字典 -
Dictionary<string, Object> dict = new Dictionary<string, Object>();
dict.Add("event.data", "data");
dict.Add("event.Location", LocObj);
dict.Add("event.Details.Cost", CostObj);
我正在尝试将其与现有的 json 结构合并 -
{
"event" : {
"name" : "Hello World",
"tags" : [tags]
}
"sponsors" : {
...
}
"OtherObj" : {
...
}
}
我正在尝试使用 ExpandoObject,然后将其注入到原始 json 中,就像这样-
foreach(KeyValuePair<string, Object> kvp in dict) {
var newObj= new ExpandoObject() as IDictionary<string, Object>;
newObj.Add(kvp.Key, value);
existingObject.Merge(JObject.FromObject(newObj), new JsonMergeSettings
{
MergeArrayHandling = MergeArrayHandling.Union
});
}
Console.WriteLine(JsonConvert.SerializeObject(existingObject));
但是当它被序列化时,event.Location 不会显示在现有的事件标签中,而是添加一个名为 event.Location 的新键。
{
"event" : {
"name" : "Hello World",
"tags" : [tags]
},
"event.Location" : { ... }, <---------------
"event.data": { ... }, <---------------
"event.Details.Cost" : { ... }<---------------
"sponsors" : {
...
},
"OtherObj" : {
...
}
}
如何修复 Expando obj 创建以解决此问题?
【问题讨论】:
-
键,在 JSON 术语以及 JavaScript 对象术语中,可以是任何字符串,包括其中带有点的字符串。如果您想要
event对象上的新属性,则需要构建它。我建议使用动态对象,例如var newObj = new { event = new { Location = LocObj, Details = new { Cost = CostObj } } }。 -
@HereticMonkey 我从不同的开发人员那里得到字典,它是动态的。我一直在寻找一种通用的方法来实现这一点并合并所有属性。
-
什么是existingObject?
-
@ZakkDiaz 这只是 JObject existingObject= JObject.FromObject(myobject); .. MyObject 包含我在第一个 Json 中粘贴的所有字段..
-
MyObject 是任意/动态类型吗?还是已知类型?
标签: c# .net json json.net expandoobject