2013-02-26 84 views
1

我试过以下示例Parsing json in C# without knowing indexes。我一直打不过一个错误:如何解析动态JSON .net newtonsoft

Newtonsoft.Json.Linq.JObject”不包含ip_addresses定义

我想实现是解析以下JSON并添加每个IP地址到ObservableCollection。如果我知道这些密钥,但通常可以命名IP地址,那么通常都会这样做。

这里是我的工作至今代码和IP地址有它自己的阶级,是因为有很多更要与它后面的应用程序:

try 
    { 
     dynamic jObj = JsonConvert.DeserializeObject(e.Result); 
     foreach (var child in jObj.ip_addresses.Children()) 
     { 
      ips.Add(new IpAddresses() { ip = child }); 
     } 
    } 
    catch 
    { 
     MessageBox.Show("Generic error message"); 
    } 

    public class IpAddresses 
    { 
     public string ip { get; set; } 
    } 
做的原因

这是JSON:

{ 
    "id": "reallysimpleid", 
    "label": "server name", 
    "ip_addresses": { 
    "private0_v4": "100.100.100.100", 
    "access_ip0_v4": "100.100.100.100", 
    "public0_v6": "1000:1000:7805:0113:9073:8c63:1000:1000", 
    "access_ip1_v6": "1000:1000:7805:0113:9073:8c63:1000:1000", 
    "public1_v4": "100.100.100.100" 
}, 
    "metadata": null, 
    "managed": false, 
    "uri": "https://www.awebsite.com", 
    "agent_id": null, 
    "created_at": 1360960027217, 
    "updated_at": 1360960027217 
} 

回答

0

你的类应该是这样的:

 public class IpAddresses 
    { 
    public string private0_v4 { get; set; } 
    public string access_ip0_v4 { get; set; } 
    public string public0_v6 { get; set; } 
    public string access_ip1_v6 { get; set; } 
    public string public1_v4 { get; set; } 
    } 

    public class RootObject 
    { 
    public string id { get; set; } 
    public string label { get; set; } 
    public IpAddresses ip_addresses { get; set; } 
    public object metadata { get; set; } 
    public bool managed { get; set; } 
    public string uri { get; set; } 
    public object agent_id { get; set; } 
    public long created_at { get; set; } 
    public long updated_at { get; set; } 
    } 

你代码应该是:

 jObj = JsonConvert.DeserializeObject<RootObject>(e.Result); 
+0

请阅读问题和最后一个注释ONT他最后回答 ,将工作的伟大,但有时IP地址的名称更改为随机值。它可能并不总是被称为public0_v6例如 – 2013-02-26 15:18:00

+0

Dang @radoslaf ...和亚历克斯,如果你不知道你的元素的名称,那么你应该使用IPaddresses中的属性来代替! – 2013-02-26 15:21:42

+0

如果元素的名称会有所不同,则应考虑使用[ExpandoObject](http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx)类而不是动态类。 .. – 2013-02-26 17:38:18

0

child对象可能不是你想要的,因为它是一个JProperty对象;如果你要求所有实际上是字符串IP地址,然后使用此:

ips.Add(new IpAddresses() { ip = child.Value.ToString() });