我正在编写一个程序,从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
方法能够顺利工作。
问候,
在前面,我不是JSON专家(我曾涉猎过),虽然我是一名称职的C#.net程序员,但我从未使用过JSON。NET。我本以为你现在至少会有一个好的、明确的答案,但由于你还没有任何,我会提供我价值0.02美元的东西,以防对你有帮助。
根据http://www.json.org.(我不确定你说这是一种"奇怪的格式",是在说你认为它无效,还是只是认为它不寻常)。
在您描述的两个示例中,它们之间都有一个一致的模式:
<string1> : <value1>,
<string2> : <value2>
在所有情况下:
- CCD_ 2
- CCD_ 3
<value1> == [ <object> ]
(即<value1>
始终是包含单个<object>
的阵列),以及<value2> == "a string describing the structure of the <object>"
此外,当<value2> == "text"
时,<object>
是一个字符串,或者当<value2> != "text"
时,它是一个更复杂的对象,在逗号分隔的列表中包含1个或多个<string> : <value>
对。
那么,如何解析,假设。Net无法开箱即用地处理这种标准格式(我很惊讶它不能)。。。
只为中的每个对象构建一个类定义。您应该能够从JSON中收集所需的结构。
你有没有想过运行一个字符串操作来"查找/提取"你感兴趣的类型,并为每个类型设置一个显式的
DataContractJsonSerializer(Type)
?否则,通常情况下,当
<value2> != "text"
时,您应该能够将<object>
中的所有内容视为Dictionary<string,string>
,然后根据在<value2>
中指定的类型,根据需要逐个处理(甚至可以"手动"将其转换为对象)。
此外,我注意到了这一点。NET 4.5引入了这种过载:
DataContractJsonSerializer构造函数(类型,DataContractJson Serializer设置)
设置如下:
DataContractJsonSerializerSettings。UseSimpleDictionaryFormat,
DataContractJsonSerializer设置。DataContractSurrogate。
特别有趣的是:
- DataContractJsonSerializerSettings。已知类型
。。。使用此实例DataContractJsonSerializerSettings序列化的对象图中可能存在的类型的集合。
这些可能是相关的,但我找不到任何关于这些设置的更多信息——也许是你可以尝试的。