【发布时间】:2019-12-09 09:36:22
【问题描述】:
目前我正在尝试访问 Azure API 管理中 JSON 属性的原始值。 我有如下要求:
{
"date": "2019-12-09T12:00:00Z"
}
还有一个类似的操作:
<inbound>
<base />
<!-- Assume datetime in format 2019-12-09T12:00:00Z -->
<set-variable name="time" value="@(context.Request.Body.As<JObject>()["date"])" />
<!-- Attempt to acquire raw value -->
<set-variable name="rawValue" value="@{
var value = JsonConvert.SerializeObject((JValue)context.Variables["date"]);
return value.ToString();
}" />
<!-- raw value is: \"2019-12-09T12:00:00Z\" -->
</inbound>
我在这里找到了类似的答案: JToken: Get raw/original JSON value 所以我尝试序列化对象。
但在我的例子中,Azure API 管理输出带有额外引号的原始值,如下所示:
set-variable (0 ms)
{
"message": "Context variable was successfully set.",
"name": "rawValue",
"value": "\"2019-12-09T12:00:01Z\""
}
一个简单的方法是替换它们,但没有更好的解决方案吗?
+++更新+++
刚刚找到这个解决方案:
Convert.ToDateTime(context.Request.Body.As<JObject>()["date"]).ToString("o")
哪个输出:
set-variable (0 ms)
{
"message": "Expression was successfully evaluated.",
"expression": "Convert.ToDateTime(context.Request.Body.As<JObject>()[\"date\"]).ToString(\"o\")",
"value": "2019-12-10T09:10:00.0000000Z"
}
IMO 这仍然不是我所期望的 100%,但至少它是正确的格式。 我仍然愿意接受任何更好的解决方案。
【问题讨论】:
-
原始值是
"2019-12-09T12:00:00Z",因为它是一个字符串,所以当你序列化它时它变成"\"2019-12-09T12:00:00Z\"",因为它包含引号。将其保留为日期,而不是对其进行序列化。 -
谢谢,但我实际上需要确保输入格式与上述完全一致。因此,我正则表达式检查该值,这仅适用于字符串。使用 .ToString() 方法时,格式将被默认日期时间格式覆盖。 .ToString("o") 和 ToString("u") 的格式也不完全相同,所以我尝试了 JsonConvert 方法。
标签: c# azure azure-api-management