我使用的是Windows Phone 8.1 SDK。 我试图将JSON字符串转换为动态对象。这与大多数情况不同,因为就像Facebook API一样,没有预定义的类来关联字符串。 具体来说,我有一个json字符串,如:
{
"indexes": {
"000000": "3d6d0abf0ae645eaf8bf090a2685c29a",
"000001": "3d6d0abf0ae645eaf8bf090a2685c29a"
}
}
等等。这意味着我显然无法将类与对象关联,因为属性名称是动态的。我想要的是能够遍历这些值,记住层次结构是"索引" - >" 000000" - >值,"索引&#34 ; - >" 000001" - >值,"索引" - >" ..." - >值。 我已经查看了JSON.NET,尝试反序列化为ExpandoObject,但这不起作用,因为看起来ExpandoObjectConverter会产生一堆编译错误,可能是因为Windows Phone 8.1环境? 无论如何,我有点碰壁,所以任何建议都会受到欢迎。
编辑:我的示例选择不当,我需要的是更通用的转换,因为它可能是一个递归结构,其中一个或多个字段可能会丢失,例如:
{
"friends": {
"020709": {
"JohnSmith" : {
"email": "johnsmith@something",
"mobile": "110011001100"
}
},
"010305": {
"PaulRoss" : {
"address": "Some way or the other",
"email": "paulross@something",
}
}
}}
由于泛型哈希映射,这在Perl中很容易实现,但看起来C#中没有真正的等价物?
答案 0 :(得分:0)
如果您的数据变化很大并且您不想创建严格的类结构,那么最好将其反序列化为JToken
,然后使用LINQ-to-JSON API来提取你需要的数据。这是一个例子:
string json = @"
{
""friends"": {
""020709"": {
""JohnSmith"": {
""email"": ""johnsmith@something"",
""mobile"": ""110011001100""
}
},
""010305"": {
""PaulRoss"": {
""address"": ""Some way or the other"",
""email"": ""paulross@something""
}
}
}
}";
JToken root = JToken.Parse(json);
foreach (JProperty idProp in root["friends"])
{
foreach (JProperty nameProp in idProp.Value)
{
JToken details = nameProp.Value;
Console.WriteLine("id: " + idProp.Name);
Console.WriteLine("name: " + nameProp.Name);
Console.WriteLine("address: " + (string)details["address"]);
Console.WriteLine("email: " + (string)details["email"]);
Console.WriteLine("mobile: " + (string)details["mobile"]);
Console.WriteLine();
}
}
输出:
id: 020709
name: JohnSmith
address:
email: johnsmith@something
mobile: 110011001100
id: 010305
name: PaulRoss
address: Some way or the other
email: paulross@something
mobile: