JSON动态对象 - 类似Perl的转换

时间:2014-11-09 17:52:52

标签: c# json serialization dynamic json.net

我使用的是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#中没有真正的等价物?

1 个答案:

答案 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: