【发布时间】: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)。