【发布时间】:2018-05-21 21:20:37
【问题描述】:
我正在为 Cosmos DB(基于文档或 JSON 的 DB)创建数据库播种器。一些 C# 模型的属性 Config 是 JSON,所以我一直在使用这种类型的代码来设置该属性:
Config = JObject.FromObject(new { })
这与在对象内实际设置属性一样工作:
Config = JObject.FromObject(new
{
contextOptionSource = "$.domains.governmentEntityType_active"
}),
但是,我不知道如何将 Config 设置为对象数组。我尝试实际使用 C# 模型,认为 JObject 会像这样为我转换它们:
Config = JObject.FromObject(
new List<Question>
{
new Question
{
Key = "contact",
Label = "Contact Person",
HelpText = "",
Config = JObject.FromObject(new {}),
Type = "text",
ContextTarget = "$.data.contact"
},
new Question
{
Key = "company",
Label = "Company Name",
HelpText = "",
Config = JObject.FromObject(new {}),
Type = "text",
ContextTarget = "$.data.company"
}
}),
这编译正常,但是当我运行时出现运行时错误“对象序列化为数组。需要 JObject 实例。”我认为 JObject 应该将 C# 模型转换为 JSON 是错误的吗?如果它们必须是通用对象,那很好,但我无法正确理解 FromObject 方法将接受此 Config 属性中的多个对象的语法。
编辑:这是我要生成的 JSON:
"config": {
"questions": [{
"key": "contact",
"label": "Contact Person",
"helpText": "Contact Person",
"config": {},
"type": QuestionKind.Textbox,
"contextTarget": "$.data.contact",
"enabledRule": null,
"validationRules": [],
"visibleRule": null
},
{
"key": "company",
"label": "Company Name",
"helpText": "Company Name",
"config": {},
"type": QuestionKind.Textbox,
"contextTarget": "$.data.company",
"enabledRule": null,
"validationRules": [],
"visibleRule": null
}]
}
【问题讨论】:
-
Config的类型必须是JToken(或JContainer)而不是JObject。您可以使用JToken.FromObject()来生成它。请参阅JSON.NET: Why Use JToken--ever? 和JContainer, JObject, JToken and Linq confusion。 -
如果我把问题说得更清楚,这就是答案。请参阅下面的解释。
-
请编辑您的 Q 以包括对您自己回答的预期结果的说明。还。见minimal reproducible example。
标签: c# json azure-cosmosdb