2016-04-21 9 views
0

Ich habe ein Problem, ich möchte Daten von Json, und die Daten erhalten erfolgreich von der JSON auf die Variable JSON, aber wenn ich die Daten an WeatherData senden will, mir einen Nullwert senden. Ich habe eine Klasse, die "WeatherData" cald und ich möchte an Daten von der JSON (die eine Klasse "JsonParse") zu dieser Klasse senden.bekomme Daten von JSON C#

jsonParse

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 
using System.Web.Script.Serialization; 
using System.IO; 


namespace weather 
{ 
    public class jsonParse : Ijson 
    { 
     private string urlAdd; 

     public jsonParse(string _url) 
     { 
      if (_url == null) 
      { 
       //throw exption 
      } 
      else 
       urlAdd = _url; 
     } 

     public WeatherData parse() 
     { 

      //string json = new WebClient().DownloadString(urlAdd); 
      //var obj = JsonConvert.DeserializeObject<WeatherData>(json); 
      //Console.WriteLine(obj.temp); 
      // WeatherData m = JsonConvert.DeserializeObject<WeatherData>(json); 


       WebClient n = new WebClient(); 
       var json = n.DownloadString(urlAdd); 
       string valueOriginal = Convert.ToString(json); 
       WeatherData m = JsonConvert.DeserializeObject<WeatherData>(json); 
       Console.WriteLine(m); 




       return m; 

     } 


    } 
} 

Wetterdaten

namespace weather 
{ 
    public class WeatherData 
    { 

     public WeatherData(double _temp, double _minTemp, double _maxTemp) 
     { 
      temp = _temp; 
      minTemp = _minTemp; 
      maxTemp = _maxTemp; 

     } 

     public double temp { get; set; } 
     public double minTemp { get; set; } 
     public double maxTemp { get; set; } 

     public override string ToString() 
     { 
      return "the weather:" + temp + "minTemp is:" + minTemp + "maxTemp:" + maxTemp; 
     } 
    } 
} 

json

{"coord":{"lon":139,"lat":35}, 
"sys":{"country":"JP","sunrise":1369769524,"sunset":1369821049}, 
"weather":[{"id":804,"main":"clouds","description":"overcast clouds","icon":"04n"}], 
"main":{"temp":289.5,"humidity":89,"pressure":1013,"temp_min":287.04,"temp_max":292.04}, 
"wind":{"speed":7.31,"deg":187.002}, 
"rain":{"3h":0}, 
"clouds":{"all":92}, 
"dt":1369824698, 
"id":1851632, 
"name":"Shuzenji", 
"cod":200} 

Antwort

1

Wenn Sie nur über das Wetter Teil der json kümmern, versuchen Sie dies -

 var o = (JArray)JObject.Parse(jsonString)["weather"]; 
     foreach(JToken item in o) 
     { 
      Console.WriteLine(((JValue)item["id"]).Value); 
      Console.WriteLine(((JValue)item["main"]).Value); 
      Console.WriteLine(((JValue)item["description"]).Value); 
      Console.WriteLine(((JValue)item["icon"]).Value); 
     } 
+0

Und wenn ich die Hauptwerte - Temp, Min Temp und Max Temp möchte, was mache ich? – user3488862

+0

so wie Sie es jetzt getan hätten. –

1

Erstes Objekt in json ist coord, sehen, dass nicht in Ihrem Modell. Sie sollten Ihr JsonModel zur Deserialisierung ändern. Von C# Klasse Generator:

public class Coord 
{ 
    public int lon { get; set; } 
    public int lat { get; set; } 
} 

public class Sys 
{ 
    public string country { get; set; } 
    public int sunrise { get; set; } 
    public int sunset { get; set; } 
} 

public class Weather 
{ 
    public int id { get; set; } 
    public string main { get; set; } 
    public string description { get; set; } 
    public string icon { get; set; } 
} 

public class Main 
{ 
    public double temp { get; set; } 
    public int humidity { get; set; } 
    public int pressure { get; set; } 
    public double temp_min { get; set; } 
    public double temp_max { get; set; } 
} 

public class Wind 
{ 
    public double speed { get; set; } 
    public double deg { get; set; } 
} 

public class Rain 
{ 
    public int __invalid_name__3h { get; set; } 
} 

public class Clouds 
{ 
    public int all { get; set; } 
} 

public class RootObject 
{ 
    public Coord coord { get; set; } 
    public Sys sys { get; set; } 
    public List<Weather> weather { get; set; } 
    public Main main { get; set; } 
    public Wind wind { get; set; } 
    public Rain rain { get; set; } 
    public Clouds clouds { get; set; } 
    public int dt { get; set; } 
    public int id { get; set; } 
    public string name { get; set; } 
    public int cod { get; set; } 
}  

Wo RootObject ist Ihr JsonConvert.DeserializeObject (json); So können Sie Klassennamen ändern, wie Sie möchten.

+1

Wenn Sie mit Ihrem Namen Eigenschaften nennen (nicht json-Namen) verwenden [JsonProperty „jsonName“] String yourname; – Elektryczny

+0

Muss ich all das in "WeatherData" eingeben? – user3488862

+0

Nun mit Deserializer denke ich, dass Sie folgende Eigenschaften zu Ihrem gerichteten verwenden müssen. Wenn Sie "Land" benötigen, müssen Sie eine Klasse mit "sys" hinzufügen. IMO. – Elektryczny

0

Sie können ein JSON-Objekt einfach nicht zu einem nicht übereinstimmenden Klassenobjekt deserialisieren. Stellen Sie also sicher, dass Sie ein Modellobjekt haben, das zumindest alle Eigenschaften des JSON-Objekts besitzt.

In diesem Fall können Sie folgende Klassen benötigen würde, die von Ihrem JSON-Objekt erzeugt werden:

public class Coord 
{ 
    public int lon { get; set; } 
    public int lat { get; set; } 
} 

public class Sys 
{ 
    public string country { get; set; } 
    public int sunrise { get; set; } 
    public int sunset { get; set; } 
} 

public class Weather 
{ 
    public int id { get; set; } 
    public string main { get; set; } 
    public string description { get; set; } 
    public string icon { get; set; } 
} 

public class Main 
{ 
    public double temp { get; set; } 
    public int humidity { get; set; } 
    public int pressure { get; set; } 
    public double temp_min { get; set; } 
    public double temp_max { get; set; } 
} 

public class Wind 
{ 
    public double speed { get; set; } 
    public double deg { get; set; } 
} 

public class Rain 
{ 
    public int __invalid_name__3h { get; set; } 
} 

public class Clouds 
{ 
    public int all { get; set; } 
} 

public class ParentModel 
{ 
    public Coord coord { get; set; } 
    public Sys sys { get; set; } 
    public List<Weather> weather { get; set; } 
    public Main main { get; set; } 
    public Wind wind { get; set; } 
    public Rain rain { get; set; } 
    public Clouds clouds { get; set; } 
    public int dt { get; set; } 
    public int id { get; set; } 
    public string name { get; set; } 
    public int cod { get; set; } 
} 

ParentModel m = JsonConvert.DeserializeObject<ParentModel>(json); 

Hoffnung, das hilft.