我故意尝试使用 Newtonsoft Json 创建无效的 JSON,以便放置一个 ESI 包含标签,这将获取另外两个 json 节点。
这是我的 JsonConverter 的 WriteJson 方法:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
mApiResponseClass objectFromApi = (mApiResponseClass)value;
foreach (var obj in objectFromApi.GetType().GetProperties())
{
if (obj.Name == "EsiObj")
{
writer.WriteRawValue(objectFromApi.EsiObj);
}
else
{
writer.WritePropertyName(obj.Name);
serializer.Serialize(writer, obj.GetValue(value, null));
}
}
}
mApiResponseClass 中的 EsiObj 只是一个字符串,但需要将其写入 JSON 响应以在没有任何属性名称的情况下进行解释 - 以便 hte ESI 可以工作。
这当然会导致 Json Writer 出现异常,其值为:
Newtonsoft.Json.JsonWriterException:'状态对象中未定义的令牌将导致无效的 JSON 对象。小路 ''。'
有没有办法解决?
一个理想的输出应该是 JSON 格式的,技术上是无效的,看起来像这样:
{
value:7,
string1:"woohoo",
<esi:include src="/something" />
Song:["I am a small API","all i do is run","but from who?","nobody knows"]
}
编辑: 使用 ESI 允许我们对单个响应具有不同的缓存长度 - 即我们可以将可以缓存很长时间的数据放在 JSON 的某些部分中,并且只获取更新的部分,例如那些依赖于客户端的部分- 特定数据。ESI 不是特定于 HTML 的。(如下文所示)它通过支持这些标签的 Varnish 运行。不幸的是,我们要求我们只发布 1 个文件作为响应,并且不需要客户的进一步请求。我们也不能改变我们的响应——所以我不能只添加一个 JSON 节点来专门包含其他节点。
编辑 2: “更多 json 节点”部分通过 ESI 向我们的后端进一步请求用户/客户端特定数据(即向另一个端点)解决。预期的结果是我们随后将原始 JSON 文档和后来请求的文档无缝地合并在一起。(这样,原始文档可以是旧的,而客户特定的可以是新的)
编辑 3: 端点 /something 将输出类似 JSON 的片段,例如:
teapots:[ {Id: 1, WaterLevel: 100, Temperature: 74, ShortAndStout: true}, {Id: 2, WaterLevel: 47, Temperature: 32, ShortAndStout: true} ],
对于以下的总响应:
{
value:7,
string1:"woohoo",
teapots:[ {Id: 1, WaterLevel: 100, Temperature: 74, ShortAndStout: true}, {Id: 2, WaterLevel: 47, Temperature: 32, ShortAndStout: true} ],
Song:["I am a small API","all i do is run","but from who?","nobody knows"]
}