2017-06-24 22 views
0

に私はクラスにウェブから取得したデータを使用して、いくつかのJSONデータをシリアル化したいので、私はhttp://json2csharp.com/に行ってきましたし、このクラスにUWP JSON C#の変換

json: [{"line_descr":"\u03a0\u0395\u0399\u03a1\u0391\u0399\u0391\u03a3 - 
\u0392\u039f\u03a5\u039b\u0391","line_descr_eng":"PEIRAIAS - VOYLA"}] 

以下のようにJSONを回し:

public class RootObject 
    { 
     public string line_descr { get; set; } 
     public string line_descr_eng { get; set; } 
    } 

これは私のコードです:

class LineName 
{ 
    public async static Task<RootObject> GetLineName(int linecode) 
    { 
     var http = new HttpClient(); 
     var response = await http.GetAsync("http://telematics.oasa.gr/api/?act=getLineName&p1=962"); 
     var result = await response.Content.ReadAsStringAsync(); 

     var serializer = new DataContractJsonSerializer(typeof(RootObject)); 
     var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
     var data = (RootObject)serializer.ReadObject(ms); 

     return data; 
    } 
} 

[DataContract] 
public class RootObject 
{ 
    [DataMember] 
    public string line_descr { get; set; } 

    [DataMember] 
    public string line_descr_eng { get; set; } 
} 


    private async void Button_Click(object sender, RoutedEventArgs e) 
    { 
     RootObject myLine = await LineName.GetLineName(92); 
     ResultTextBlock.Text = myLine.line_descr_eng; 
    } 

だから私は、データを取得し、私のテキストブロックに表示しようとすると、私はエラーが発生します:line_descr_engはnullです。

誰かがどこに障害があるのか​​を指摘できますか? line_descr_engは PEIRAIAS - VOYLAである必要がありますが、私はnullであり、多くの検索の後では、どこに障害があるのか​​わかりません。

答えて

2

jsonはオブジェクトではなく配列です。配列に逆シリアル化する必要があります。

置き換えます

public async static Task<RootObject[]> GetLineName(int linecode) 
{ 
    var http = new HttpClient(); 
    var response = await http.GetAsync("http://telematics.oasa.gr/api/?act=getLineName&p1=962"); 
    var result = await response.Content.ReadAsStringAsync(); 

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

    return data; 
} 
//... 


var myLines = await LineName.GetLineName(92); 
var myLine = myLines.FirstOrDefault(); 

また、あなたは

var result = await response.Content.ReadAsStreamAsync(); 
+0

[OK]を私はこれを試してみましたが、それはそれはRootObject変換カント言います[]からRootObjectへのエラーは、 "return data"です。あなたはもう少しそれを指定できますか? :) – panoukos41

+1

@PanosPanosAthanasiouが投稿を編集しました。基本的には、メソッドの戻り値の型と変数の型を新しいデータ型に合わせて変更する必要があります。 –

+0

それはうまくいった^ _^thnx !!ちょうど2番目のvarは、最初のものとは異なる名前が必要です:) 基本的には配列を返してから、その配列の最初の項目を取得します。 – panoukos41

0

あなたシンプルなこのよう代わりにDataContractJsonSerializerのJavaScriptSerializerクラスを使用することができますが、HTTPレスポンスからストリームを読み取ることができ、メモリストリームを必要としません:

var serializer = new DataContractJsonSerializer(typeof(RootObject)); 
var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
var data = (RootObject)serializer.ReadObject(ms); 

var ser = new JavaScriptSerializer(); 
var test = ser.Deserialize<List<RootObject>>(json); 

あなたがJavaScriptSerializerを見つけることができない場合は、あなたが簡単な次の手順を実行する必要があります。

から引用
  1. Right click References and do Add Reference, then from Assemblies->Framework select System.Web.Extensions.
  2. Now you should be able to add the following to your class file:

    using System.Web.Script.Serialization; 
    

https://stackoverflow.com/a/15391388/5056173

関連する問題