2016-10-24 21 views
1

C#プログラムに少し問題があります。それはC#の私の最初のプログラムですので、どうかお許しください。C#オブジェクトにJSONを逆シリアル化する

jsonファイルをオブジェクトに逆シリアル化したいのですが、どのようにクラスを構築するのか分かりません。私はNewtonsoft JSONのlibを使用しています。

JSONファイル:

http://api.nbp.pl/api/exchangerates/tables/A/last/?format=json


のForm1.cs:

private void button1_Click(object sender, EventArgs e) 
    { 
     CurrencyCodeValues k = new CurrencyCodeValues(); 
     WebClient myWebClient = new WebClient(); 
     dynamic result = myWebClient.DownloadString("http://api.nbp.pl/api/exchangerates/tables/A/last/?format=json"); 
     IList<CurrencyCodeValues> m = JsonConvert.DeserializeObject<CurrencyCodeValues>(result); 
    } 

のClass1.cs:

class CurrencyCodeValues 
{ 
    public string table { get; set; } 
    public string no { get; set; } 
    public string effectiveDate { get; set; } 
    public List<rates_> rates { get; set; } 

} 

public class rates_ 
{ 
    public string currency { get; set; } 
    public string code { get; set; } 
    public float mid { get; set; } 
} 

エラーメッセージ:

現在のJSON配列をデシリアライズすることはできません(例えば、 [1,2,3])をタイプ 'WindowsFormsApplication4.CurrencyCodeValues'に変換するには、そのタイプでJSONオブジェクト(例:{"name": "value"})が正しくデシリアライズされている必要があります。 このエラーを修正するには、JSONオブジェクトをJSONオブジェクト(例:{"name": "value"})に変更するか、またはデシリアライズされた型をArrayやListなどのコレクションインターフェイス(ICollection、IListなど)を実装する型に変更します。 JSON配列からデシリアライズできます。 JsonArrayAttributeを型に追加して、強制的にJSON配列から逆シリアル化することもできます。あなたのエラーメッセージとして パス ''、行1、位置1

+0

ちょうどこのCurrencyCodeValuesメートル= JsonConvert.DeserializeObject (結果)を書き込みます。 –

答えて

1

あなたのクラスは、この

public class Rootobject 
{ 
    public Class1[] Property1 { get; set; } 
} 

public class Class1 
{ 
    public string table { get; set; } 
    public string no { get; set; } 
    public string effectiveDate { get; set; } 
    public Rate[] rates { get; set; } 
} 

public class Rate 
{ 
    public string currency { get; set; } 
    public string code { get; set; } 
    public float mid { get; set; } 
} 

ようになり、その後、JSONをdeserialisingながら

JsonConvert.DeserializeObject<Rootobject>(result); 
0

のようにそれをdeseralize必要があります示唆jsonはリスト、マップ、およびデータを保持し、それにロジックを持つ他の構造をサポートしていないため、基本構造とカスタムクラスを使用する必要があります。 YOUT要求がCurrencyCodeValuesオブジェクトではなく、単一のオブジェクト

1

の配列を返すので、あなたがわからない場合は、ラッパークラスを追加する必要があります - これはあなたがMohit Shrivastavaが推薦してもrates_[]

を使用する必要がList<rates_>使用できないことを意味しますVisual Studio(VS2013 Update 2以降)は、クラスモデルが特定のjson構造に一致するように見えるようにするために、非常に役立つ機能を備えています。 JSON文字列をコピーしてVisual Studioに移動し、[編集] - > [形式を選択して貼り付け] - > [JSONをクラスとして貼り付け]をクリックします。
これでVisual Studioはフィッティングクラスモデルを構成します。あなたのケースでは


(Mohit Shrivastavaが既に提案のように)それは次のようになります。

public class Rootobject 
{ 
    public Class1[] Property1 { get; set; } 
} 

public class Class1 
{ 
    public string table { get; set; } 
    public string no { get; set; } 
    public string effectiveDate { get; set; } 
    public Rate[] rates { get; set; } 
} 

public class Rate 
{ 
    public string currency { get; set; } 
    public string code { get; set; } 
    public float mid { get; set; } 
} 
関連する問題