2017-05-17 8 views
-2

私はJSONデータをデシリアライズトラブルを抱えている、私は他のJSONデータで正常に使用しています。このコードを持っている:デシリアライズJSONデータ

 string url = string.Format("http://farmsense-prod.apigee.net/v1/moonphases/?d=1494981184"); 
     var http = new HttpClient(); 
     var response = await http.GetAsync(url); 
     var result = await response.Content.ReadAsStringAsync(); 
     var serializer = new DataContractJsonSerializer(typeof(Lunar_data.RootObject)); 
     var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
     var data_moon = (Lunar_data.RootObject)serializer.ReadObject(ms); 
     return data_moon; 

このコードは唯一のnull値が返されます!ここで

https://jsonutils.com/

public class Lunar_data 
{ 

    public class RootObject 
    { 

     [JsonProperty("Error")] 
     public int Error { get; set; } 

     [JsonProperty("ErrorMsg")] 
     public string ErrorMsg { get; set; } 

     [JsonProperty("TargetDate")] 
     public string TargetDate { get; set; } 

     [JsonProperty("Moon")] 
     public IList<string> Moon { get; set; } 

     [JsonProperty("Index")] 
     public int Index { get; set; } 

     [JsonProperty("Age")] 
     public double Age { get; set; } 

     [JsonProperty("Phase")] 
     public string Phase { get; set; } 

     [JsonProperty("Distance")] 
     public double Distance { get; set; } 

     [JsonProperty("Illumination")] 
     public double Illumination { get; set; } 

     [JsonProperty("AngularDiameter")] 
     public double AngularDiameter { get; set; } 

     [JsonProperty("DistanceToSun")] 
     public double DistanceToSun { get; set; } 

     [JsonProperty("SunAngularDiameter")] 
     public double SunAngularDiameter { get; set; } 
    } 

} 

で生成された私のクラスであり、これは本当に簡単で、まだ私はそれが権利を取得することができない私のJSONデータである:

最後に
[{"Error":0,"ErrorMsg":"success","TargetDate":"1350526582","Moon":["Hunter's\/Harvest Moon"],"Index":2,"Age":2.9555953469264,"Phase":"Waxing Crescent","Distance":363325.22,"Illumination":0.1,"AngularDiameter":0.54815395361483,"DistanceToSun":149016616.79983,"SunAngularDiameter":0.53520976935835}] 

いくつかの検索の後に私はNewtonsoft.Jsonを使用していくつかの人々を見つけましたが、jsonデータのこれらの引用符のために使用できませんでした。

+0

Newtonsoft.Jsonを使用しようとしましたか? –

+0

私はそれを使用することができませんでした、私は何とかjsonデータのそれらの引用符を扱う必要があります! – khalefa

+0

@khalefa、Newtonsoft.Jsonがこれらの引用符を扱うことができないと主張するのは、Newtonsoft.JsonがJsonを全く扱うことができないということです。誰が知っていた... ;-) – elgonzo

答えて

3

問題は、jsonが配列であり、RootObjectのインスタンスにデシリアライズしていることです。試しました

const string jsondata = "[{\"Error\":0,\"ErrorMsg\":\"success\",\"TargetDate\":\"1350526582\",\"Moon\":[\"Hunter's\\/Harvest Moon\"],\"Index\":2,\"Age\":2.9555953469264,\"Phase\":\"Waxing Crescent\",\"Distance\":363325.22,\"Illumination\":0.1,\"AngularDiameter\":0.54815395361483,\"DistanceToSun\":149016616.79983,\"SunAngularDiameter\":0.53520976935835}]"; 

Lunar_data.RootObject[] res = JsonConvert.DeserializeObject<Lunar_data.RootObject[]>(jsondata); 

とうまくいきました。私は引用符をエスケープしなければならなかったのは、jsonが自分のコードで文字列constに入っていますが、httpコールから戻ってくる応答が適切にフォーマットされていると仮定する必要はありません。

また、あなたのコードでは、ちょうどあなたが

var serializer = new DataContractJsonSerializer(typeof(Lunar_data.RootObject[])); 
var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
var data_moon = (Lunar_data.RootObject[])serializer.ReadObject(ms); 

を取得し、それが動作

Lunar_data.RootObject[] 

Lunar_data.RootObject 

を交換してください。しかし、私はNewtonsoftを使うだろう。

+0

ありがとう、それはありがとうNemanjaあなたは私のプロジェクトを保存していただきありがとうございます! – khalefa

+0

うわー:)それを聞いてうれしい、そして前向きな幸運! –

関連する問題