当前位置: 首页 > 知识库问答 >
问题:

使用 NewtonSoft 的 JSON 结构的序列化问题

端木志诚
2023-03-14

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

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

我的目标是有一种方法来存储灵活的json结构,而不将其束缚在静态结构上。例如,在下面的TriggerJson中,实际的触发器字段是字符串类型,应该是json。该json结构可以反映ExggiryTriggerJson,或由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);

这将创建以下结构,例如,触发器字段反映了由于双重序列化而转义双引号的序列化结构:

[{"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数据存储为字符串,然后以嵌套方式将其解析回去的目标?

共有1个答案

宗冷勋
2023-03-14

这可能是你想要的。

public dynamic Trigger {get;set;}

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

 类似资料:
  • 我的JSON如下: 我找到了Newtonsoft JSON。NET为C#反序列化库。我试着使用它如下: 如何访问对象以获取所有“类型”数据?我尝试了一个循环,但它不起作用,因为对象没有枚举器。

  • 它似乎只是简单地删除了转义字符,将一些空字符串转换为空字符串,并将整个内容包装在一组额外的花括号中。就像它被反序列化为不同的序列化格式一样。 在其他SO问题中,答案建议创建一个类来反序列化: 但当我这么做的时候,我得到了一个例外: 我需要一种方法来引用这个响应中的名称和Employee_ID。我对JSON比较陌生。

  • 问题内容: 我已经使用Newtonsoft的JSON序列化器序列化了一个对象,而DateTime的实现方式是: 当我在其上$ .evalJSON()时,它是一个对象,但在它上找不到任何正常的Date方法,例如toUTCString。 有什么办法可以解决吗? 问题答案: 使用Json.NET附带的JsonConverters之一处理日期以获得更好的格式。JavaScriptDateTimeConve

  • 问题内容: 我们正在将JSON发送到由swagger定义的API,其中一些属性是DateTime,格式为yyyy-MM- ddThh:mm:ss.000Z(毫秒数必须为3位,否则端点上的验证失败),而有些则是Date(否)时间)属性。 我已经看到很多消息说使用这样的格式化程序: 但这不能将DateTimes转换为正确的格式,C#如何处理仅Date类型?它似乎总是序列化为DateTime.MinVa

  • 问题内容: 有什么方法可以用Newtonsoft Json.Net json序列化程序替换内置的WCF服务应用程序JavascriptSerializer? 问题答案: WCF不使用。它使用DataContractJsonSerializer。是的,您可以通过编写自定义消息格式化程序来用Json.NET替换它,如以下博客文章所示。

  • 我需要将一个pojo序列化成不同的json结构,这取决于我发送请求的对象。此外,我应该能够在一些配置中配置pojo字段如何映射到给定请求的json属性。 这可以用杰克逊来实现吗?是否有一些库或API可以做到这一点? 编辑:例如: 上面是我创建动态json需要的两个对象,下面是一些转换的例子