【问题标题】:issue casting json object问题转换 json 对象
【发布时间】: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>>();
  • 啊,好的,谢谢。我明白。我认为由于某种原因解析就足够了。现在它工作正常。如果您将其作为答案提供,我可以将其标记为这样。

标签: c# json .net json.net


【解决方案1】:

您的问题可能与这些行(主要是 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)

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

附:而不是使用dynamic 作为Trigger 属性,您可能想要查看一个公共基类和一个JsonConverter,因为JSON.NET 不知道您要反序列化到什么类型,所以@ 987654333@ 属性将被反序列化为 JObject 而不是特定类型。

This 可能会让您知道如何处理它,但如果您包含一个字符串属性来指示您拥有的触发器类型,然后在使用转换器反序列化它时读取该属性,它可能会更容易。

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多