2014-05-03 49 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);