JSON规范说JSON是一个对象或数组.在物体的情况下,
对象结构表示为围绕零个或多个名称/值对(或成员)的一对花括号. 名称是一个字符串. ...
后来,规范说一个字符串被引号括起来.
为什么?
从而,
{"Property1":"Value1","Property2":18}
Run Code Online (Sandbox Code Playgroud)
并不是
{Property1:"Value1",Property2:18}
Run Code Online (Sandbox Code Playgroud)
问题1:为什么不允许名称/值对中的名称是不带引号的标识符?
问题2:在Javascript中评估时,上述两种表示之间是否存在语义差异?
我故意尝试使用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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
mApiResponseClass中的EsiObj只是一个字符串,但是需要将其写入JSON响应中,以便在不使用任何属性名的情况下进行解释-这样HSI 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"]
}
Run Code Online (Sandbox Code Playgroud)
编辑: 使用ESI,我们可以使单个响应具有不同的缓存长度-即,我们可以将可以缓存很长时间的数据放置在JSON的某些部分中,并且仅获取更新的部分,例如那些依赖客户端的部分特定的数据。ESI不是特定于HTML的。(如下所示)通过支持这些标签的Varnish运行。不幸的是,要求我们仅发出1个文件作为响应,并且不需要客户进一步的要求。我们也不能更改响应-所以我不能只添加一个专门包含其他节点的JSON节点。
编辑2: “更多json节点”部分是通过ESI解决的,它向我们的后端进一步请求用户/客户端特定的数据,即另一个端点。预期的结果是,我们随后将原始JSON文档与后来的JSON文档无缝地合并在一起。(这样,原始文档可能会很旧,而特定于客户的文档可能会很新)
编辑3: 端点/ something将输出类似JSON的片段,例如:
teapots:[ {Id: 1, WaterLevel: 100, Temperature: 74, ShortAndStout: …Run Code Online (Sandbox Code Playgroud)