发布投射 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 可能会让您了解如何处理它,但如果您包含一个字符串 属性 来指示您拥有的触发器类型,然后阅读 属性 当你用转换器反序列化它时。
注意:我正在遵循本指南: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 可能会让您了解如何处理它,但如果您包含一个字符串 属性 来指示您拥有的触发器类型,然后阅读 属性 当你用转换器反序列化它时。