【发布时间】:2021-02-05 01:10:25
【问题描述】:
注意:我正在关注本指南:https://weblog.west-wind.com/posts/2012/aug/30/using-jsonnet-for-dynamic-json-parsing
我的目标是有一个基本的 json 结构,可以调整到里面的动态结构。例如,我使用以下结构来存储触发器 Json 数据:
public class TriggerJson
{
public string TriggerType { get; set; }
public string ConfiguredBy { get; set; }
public dynamic Trigger { get; set; }
}
上述结构将在 Trigger 属性中存储任何动态结构。比如下面这个:
public class ExpiryTriggerJson
{
public string ActionType { get; set; }
public TriggerRecipient[] Recipients { get; set; }
}
//... more Trigger structures like ExpiryTriggerJson above
我可以将这个罚款存储在一个 TriggerJson 数组中。问题是当我想更新结构时。例如,我想更新或替换数组中的 TriggerJson 条目之一的 Trigger 属性。下面是我的代码在将新的 ExpiryTriggerJson 对象分配给 TriggerJson.Trigger 属性时遇到转换为 Json 类型的问题。我只是将原始 TriggerJson 数组转换为 JArray 并遍历每个条目,当我找到要替换的适当条目时,我尝试这样做:
var expiryTriggerJson = new ExpiryTriggerJson
{
Recipients = taskRecipients.ToArray(),
ActionType = TriggerJsonHelper.ExpiryTriggerActionType_Task
};
JArray tjList = JArray.Parse(originalTriggersJson);
foreach (dynamic triggerJson in tjList)
{
if (triggerJson.TriggerType == ExpiryTriggerType)
{
triggerJson.Trigger = expiryTriggerJson; // this line is throwing an exception
triggerJson.ConfiguredBy = configuredBy;
}
}
return JsonConvert.SerializeObject(tjList);
我的问题是:是否可以以这种方式修改现有的 json 结构?还是我应该采用不同的方法?
【问题讨论】:
-
每次使用
dynamic时,总是想着自己有更好更快更安全的方法。永远知道你迟早会遇到这样的情况。 -
"// 这行抛出异常" - 什么异常?为什么你期望
JArray.Parse会产生TriggerJson的列表(它不会)? -
因为我正在创建一个 TriggerJson 列表并最初对其进行序列化。此功能仅在我想更新该列表时显示。 foreach 循环工作并进入每个条目。
-
“因为我正在创建一个 TriggerJson 列表并最初对其进行序列化。” - 这并不意味着它将它返回到
TriggerJson的集合中 - 它无法知道你想这样做。你可能想要List<TriggerJson> tjList = JsonConvert.DeserializeObject<List<TriggerJson>>(); -
啊,好的,谢谢。我明白。我认为由于某种原因解析就足够了。现在它工作正常。如果您将其作为答案提供,我可以将其标记为这样。