【问题标题】:serialization issue with json structure using newtonsoft使用 newtonsoft 的 json 结构的序列化问题
【发布时间】:2021-02-04 03:21:10
【问题描述】:

这是一个旧应用程序 (.Net 4.5)。

我在这里遵循指南:https://weblog.west-wind.com/posts/2012/aug/30/using-jsonnet-for-dynamic-json-parsing

我的目标是找到一种方法来存储灵活的 json 结构,而无需将其绑定到静态结构。比如下面的TriggerJson,实际的Trigger字段是string类型的,应该是json。该 json 结构可以反映 ExpiryTriggerJson,或由 TriggerType 确定的其他结构。

我有以下结构:

public class TriggerJson
{        
    public string TriggerType { get; set; }        
    public string ConfiguredBy { get; set; }
    public string Trigger { get; set; }
}

public class ExpiryTriggerJson
{
    public string ActionType { get; set; }
    public TriggerRecipient[] Recipients { get; set; }
}

public class TriggerRecipient
{
    public string Id { get; set; }
    public string Name { get; set; }
    public bool IsTag { get; set; }

}

在下面的代码中,我创建了一个 TriggerJson 列表,这样每个元素的 Trigger 字段都是一个由 ExpiryTriggerJson 对象组成的 json 结构:

            var tjList = new List<TriggerJson>();
            var triggerJson = new TriggerJson();
            triggerJson.TriggerType = TriggerJsonHelper.ExpiryTriggerType;
            triggerJson.Trigger = JsonConvert.SerializeObject(new ExpiryTriggerJson
            {
                Recipients = taskRecipients,
                ActionType = TriggerJsonHelper.ExpiryTriggerActionType_Task
            });                    
            triggerJson.ConfiguredBy = configuredBy;
            tjList.Add(triggerJson);
            fieldValue.TriggersJson = JsonConvert.SerializeObject(tjList);

这将创建以下结构,例如,其中 Trigger 字段反映了一个序列化结构,该结构由于双序列化而已转义双引号:

[{"TriggerType":"ExpiryTrigger","ConfiguredBy":"acd1ac353ac44e078aaef8ce6479a4c6","Trigger":"{\"ActionType\":\"CreateReminderTask\",\"Recipients\":[{\"Id\":\"70050a95-f31b-41b7-9b49-0688fa76dba5\",\"Name\":\"blah blah\",\"IsTag\":false}]}"}]

当我稍后在读取数据时尝试反序列化这些数据时,这给我带来了问题:

JArray jsonObj = JArray.Parse(triggersJson);
            foreach (dynamic obj in jsonObj)
            {
                if (obj.TriggerType == ExpiryTriggerType)
                {
                    ExpiryTriggerJson triggerData = obj.Trigger.ToObject<ExpiryTriggerJson>();

上面的代码试图解析回最初分配给 TriggerJson 元素的字段 Trigger 的 ExpiryTriggerJson 结构。这会在执行尝试转换为 ExpiryTriggerJson 的最后一行时引发运行时反序列化异常,我怀疑这是由于双重反序列化而发生的。

我的问题是如何实现将静态/结构 json 数据存储为字符串然后以嵌套方式解析回来的目标?

【问题讨论】:

  • 尝试将您的动态 json 属性存储为 JToken (JObject, JArray)。

标签: c# json .net json.net


【解决方案1】:

这可能是你想要的。

public dynamic Trigger {get;set;}

然后触发器将被解析为它在运行时接收到的任何类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多