【问题标题】:Cannot get an XML string value from token type 'StartObject'无法从令牌类型“StartObject”获取 XML 字符串值
【发布时间】:2014-08-27 22:03:41
【问题描述】:

我一直在试用 Azure 最近宣布的搜索服务,并且正在使用 JSON.Net 将生成的 JSON 输出转换为 XML。它通常可以正常工作,除非添加高亮参数时我收到Cannot get an XML string value from token type 'StartObject'. Path 'value[0].@search.highlights' 错误消息。 highlight 参数添加了解析器似乎不喜欢的@search.highlights。我还在 jsonvalidatortool.com 上检查了 JSON 输出,结果是有效的。

从 Azure 搜索服务收到的 JSON 如下:

{
  "value":
    [
      {
        "@search.score": 1.2591839,
        "@search.highlights": 
          {
            "kbTitle@odata.type": "#Collection(String)",
            "kbTitle": [
              "No Video / Blank Screen When Attempting to Stream from <em>Netflix</em>"
            ]
          },
        "kbID":"10",
        "kbTitle":"No Video / Blank Screen When Attempting to Stream from Netflix"
      }
    ]
}

还有其他人在尝试使用 JSON.Net 的新 Azure 搜索服务并遇到此问题吗?

【问题讨论】:

    标签: c# xml json azure json.net


    【解决方案1】:

    不幸的是,这个 JSON 虽然有效,但无法通过 Json.Net 直接转换为 XML,原因有两个:

    1. 当 JSON.Net 看到以 @ 开头的 JSON 属性名称时,它会尝试将其转换为 XML 中的属性。 XML 属性必须是简单值(字符串、整数等);它不能是一个复杂的对象。在 JSON 中,@search.highlights 属性的值显然是一个复杂的对象,因此无法转换为 XML 属性。这就是您收到错误消息的原因。

    2. XML 标签名称不能包含@。假设我们能够解决第一个问题(例如,通过从 @search.highlights 中删除前导 @),尝试将 kbTitle@odata.type 属性转换为 XML 标记时将引发另一个错误,因为它包含@ 在中间。

    想到了几个可能的解决方案:

    快速而简单的方法是在将 JSON 转换为 XML 之前尝试对其进行字符串替换。如果问题区域只是我突出显示的那两个特定属性名称,那么您可以专门针对它们来删除或替换 @ 字符,并用下划线 _ 之类的 XML 更可取的字符替换。如果 JSON 更加动态,使得问题属性名称变化很大,那么这种方法不太可能正常工作。你比我更了解你的数据——我对 Azure 搜索服务不是很熟悉。

    更强大的解决方案是将 JSON 反序列化为 JObject,然后手动遍历 JObject 并按照您需要的方式将其转换为 XML。您可以省略不需要的部分,更改属性/标签名称等。当然,这假设您熟悉 Json.Net 的 LINQ-to-JSON API(JObject、JTokens、JArrays 等)并且熟悉.NET 框架中System.Xml namespace 中的类。

    另一个想法是创建一个中间模型类,将 JSON 反序列化为该类(因此您可以使用 [JsonProperty] 属性来处理时髦的属性名称),然后使用 XmlSerializer 将该模型转换为 XML。

    希望这会有所帮助。

    【讨论】:

    • 你太棒了!感谢您的详尽解释和建议的解决方案,我现在对这个问题以及如何处理它有了很好的了解。
    • 没问题。很高兴我能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2016-01-19
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多