发布投射 json 对象

issue casting json object

注意:我正在遵循本指南: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 结构?或者我应该有不同的方法吗?

您的问题可能出在这些行(主要是 Parse 行):

JArray tjList = JArray.Parse(originalTriggersJson);
foreach (dynamic triggerJson in tjList)

JArray 无法知道您正在解析的 JSON 代表什么类型的对象,因此它将把它解析为 JObject 的数组(在本例中) ,而不是 TriggerJson.

的数组

您真正想要做的是将其解析为 TriggerJson:

的列表
List<TriggerJson> tjList = JsonConvert.DeserializeObject<List<TriggerJson>>(originalTriggersJson);

然后你也可以在循环中使用 dynamic 类型,因为我们知道类型:

foreach(TriggerJson triggerJson in tjList)

这应该可以解决您的问题。

P.S。不要将 dynamic 用于 Trigger 属性,您可能希望研究一个共同的基数 class 和一个 JsonConverter 作为 JSON.NET ] 不知道您要反序列化为什么类型,因此 Trigger 属性 将被反序列化为 JObject 而不是特定类型。

This 可能会让您了解如何处理它,但如果您包含一个字符串 属性 来指示您拥有的触发器类型,然后阅读 属性 当你用转换器反序列化它时。