5

我正在编写一个程序来从 Podio 读取 JSON 字符串,然后将内容转换为 c# 对象。

但是在阅读提要时,我遇到了一种奇怪的格式;在对象的同一层级中,字段 [value] 的值有时是字符串,有时是复杂对象。

示例如下。

有些地方就像

"values":[
    {
        "value":"Bug on User Interface, Ajax sometimes does not load properly"
    }
],
"type":"text"

然后在下一个项目,在层次结构的同一级别,就像

"values":[
    {
        "value":{
            "perma_link":"https:\/\/ds-test.podio.com\/myworkspace\/files\/23529948",
            "mimetype":"image\/jpeg",
            "hosted_by":"podio",
            "name":"217820_274164679355286_689330144_n.jpg",
            "hosted_by_humanized_name":"Podio",
            "description":null,
            "thumbnail_link":"https:\/\/files.podio.com\/23529948",
            "link":"https:\/\/files.podio.com\/23529948",
            "file_id":23529948,
            "size":39698
        }
    }
],
"type":"image"

注意“type”的值:首先是“text”,然后是“image”。由于它们位于层次结构的同一级别,我不知道如何为它们设计对象以使该DataContractJsonSerializer.Read方法顺利​​运行。

问候,

4

1 回答 1

2

首先,我不是 JSON 专家(我曾涉足过),虽然我是一名称职的 C#.net 程序员,但我从未使用过来自 .NET 的 JSON。我原以为你现在至少有一个好的、明确的答案,但由于你还没有答案我会提供价值 0.02 美元的答案,以防它对你有帮助。

根据http://www.json.org ,这是一种有效的格式。(我不确定说这是一种“奇怪的格式”,你是说你认为它无效,或者只是你认为它不寻常)。

在您描述的两个示例中,它们之间存在一致的模式:

<string1> : <value1>,
<string2> : <value2>

在所有情况下:

  • <string1> == "Values",
  • <string2> == "type",
  • <value1> == [ <object> ](即<value1>始终是一个包含单个 的数组<object>),并且
  • <value2> == "a string describing the structure of the <object>"

此外,<object>when 是一个字符串,或者它是一个更复杂的对象,它在一个逗号分隔的列表<value2> == "text"中包含 1 个或多个对 when 。<string> : <value><value2> != "text"

那么,如何解析,假设 .Net 无法处理这种开箱即用的标准格式(我很惊讶它不能)......

  • 仅为您感兴趣的每个对象构建一个类定义。您应该能够从 JSON 中收集所需的结构。

  • 您是否考虑过运行字符串操作来“查找/提取”您感兴趣的类型,并DataContractJsonSerializer(Type)为每种类型设置显式?

  • 否则,更一般地说,您应该能够将<object>when <value2> != "text", as a中的所有内容处理Dictionary<string,string>,然后根据您在指定的类型<value2>(甚至“手动”将它们转换为您的对象)根据需要逐个处理它.


此外,我注意到 .NET 4.5 引入了这种重载:

DataContractJsonSerializer 构造函数(类型,DataContractJsonSerializerSettings)

设置如下:

特别有趣的是:

...使用此实例序列化的对象图中可能存在的类型集合 DataContractJsonSerializerSettings。

这些可能是相关的,但我找不到任何关于这些设置的更多信息——也许你可以尝试一下。

于 2012-10-12T15:48:19.637 回答