2014-05-03 107 views
1

我的问题是与Json.NET加载JSON在这个网址:http://www.poatransporte.com.br/php/facades/process.php?a=il&p=5399问题加载JSON与变量名

这里是JSON的一个参考样本缩写:

{ 
    "0": { 
     "lat": "-30.03087344108400000", 
     "lng": "-51.22585742359100000" 
    }, 
    "1": { 
     "lat": "-30.03094644108400000", 
     "lng": "-51.22480142359100000" 
    }, 
    "2": { 
     "lat": "-30.03099144108400000", 
     "lng": "-51.22434242359100000" 
    }, 
    "190": { 
     "lat": "-30.11229544108400000", 
     "lng": "-51.24937242359100000" 
    }, 
    "191": { 
     "lat": "-30.11159444108400000", 
     "lng": "-51.24973042359100000" 
    }, 
    "idlinha": "5399", 
    "nome": "CAMAQUA ", 
    "codigo": "173-2" 
} 

进入RoteBus.rote的值始终为空。 有人可以帮我吗?

我正在使用的代码:

WebClient webClient2 = new WebClient(); 
webClient2.DownloadStringCompleted += new DownloadStringCompletedEventHandler(itinerario); 
webClient2.DownloadStringAsync(new Uri("http://www.poatransporte.com.br/php/facades/process.php?a=il&p=5399")); 
void itinerario(object sender, DownloadStringCompletedEventArgs e) 
{ 

    RoteBus rootObject = JsonConvert.DeserializeObject<RoteBus>(e.Result); 
    Debug.WriteLine("rootObject.rote = " + rootObject.rote); 
} 

public class Rote 
{ 
    public string lat { get; set; } 
    public string lng { get; set; } 
} 

public class RoteBus 
{ 
    public string idlinha { get; set; } 
    public string nome { get; set; } 
    public string codigo { get; set; } 
    public Dictionary<string, Rote> rote { get; set; } 
} 
+0

的JSON没有“死记硬背”的对象。或者是“idlinha”,“nome”或者“codingo”。 – mason

回答

0

的因变量Rote数据与RoteBus的固定属性混合的方式,你将需要自定义JsonConverter类,使这项工作。下面是编写的一种方式:

public class RoteBusConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(RoteBus)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JObject jo = JObject.Load(reader); 
     RoteBus rb = new RoteBus { rote = new Dictionary<string, Rote>() }; 
     foreach (JProperty prop in jo.Properties()) 
     { 
      if (prop.Name == "idlinha") 
       rb.idlinha = prop.Value.ToString(); 
      else if (prop.Name == "nome") 
       rb.nome = prop.Value.ToString(); 
      else if (prop.Name == "codigo") 
       rb.codigo = prop.Value.ToString(); 
      else 
       rb.rote.Add(prop.Name, prop.Value.ToObject<Rote>()); 
     } 
     return rb; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

要使用转换器,添加一个[JsonConverter]属性您RoteBus类是这样的:

[JsonConverter(typeof(RoteBusConverter))] 
public class RoteBus 
{ 
    ... 
} 

然后反序列化和往常一样:

RoteBus rootObject = JsonConvert.DeserializeObject<RoteBus>(e.Result);