2016-09-05 24 views
1

解析私は、このJSON持っているJSON fromVAT EU

"rates": { 
     "AT": { 
      "country": "Austria", 
      "standard_rate": 20.00, 
      "reduced_rate": 10.00, 
      "reduced_rate_alt": 13.00, 
      "super_reduced_rate": false, 
      "parking_rate": 12.00 
     }, 
     "BE": { 
    ... 

を、私はしようとは、このクラスでこのJSONをマッピングしますが、私は、JSONは、タグがオブジェクトであるstruredされている方法becouse問題を抱えています。そして、私はattributteする必要があります

public class Rate{ 
public string Tag { get; set; } 
public string country { get; set; } 
public double standard_rate { get; set; } 
public double reduced_rate { get; set; } 
public double reduced_rate_alt { get; set; } 
public bool super_reduced_rate { get; set; } 
public double parking_rate { get; set; } 
} 

私はこれをsigleオブジェクトにどのようにマップしますか?

+0

JSONの「タグ」はどこですか? – Plutonix

+0

タグi wantoは 'AT'または 'BE'と等しくなります –

+1

ATとBEは辞書のキーのように機能します。構造を見てください。残りはデータの残りではありません。もしあなたが*あなたが所有するプロパティにしなければならないなら、あなた自身のコンバータを書く必要があると思います。 – Plutonix

答えて

3

投稿された(部分的な)JSONを見ると、Tagとして参照したいものは残りのデータとは異なるレベルにあります。カッコを無視してインデントを見てください。

これは辞書として使用されるように見え、そのように簡単に逆シリアル化されているようです。

{ 
"rates": { 
    "AT": { 
     "country": "Austria", 
     "standard_rate": 20.00, 
     "reduced_rate": 10.00, 
     "reduced_rate_alt": 13.00, 
     "super_reduced_rate": false, 
     "parking_rate": 12.00 
    }, 
    "BE": { 
     "country": "Belguim", 
    ... 
    } 
    } 
} 

クラス:(JSON.NETを使用して)それを使用する

public class VRates 
{ 
    public Dictionary<string, VRate> rates { get; set; } 
} 

public class VRate 
{ 
    public string country { get; set; } 
    public float standard_rate { get; set; } 
    public float reduced_rate { get; set; } 
    public float reduced_rate_alt { get; set; } 
    public bool super_reduced_rate { get; set; } 
    public float parking_rate { get; set; } 
} 

コード:

string jstr = ... json from where ever 
VRates rates = JsonConvert.DeserializeObject<VRates>(jstr); 

あなたの "タグ" は簡単なルックアップを許可する鍵となります。あなたが好きな場合は、外部クラスを当てることができます。

var rates = JsonConvert.DeserializeObject<VRates>(jstr).rates; 

foreach (KeyValuePair<string, VRate> kvp in rates) 
{ 
    Console.WriteLine("key: {0}, country: {1}", kvp.Key, kvp.Value.country); 
} 

出力:

キー:国、AT:オーストリア
キー:BE、国:Belguim

をあなたの場合は本当にそのクラスをratesクラスに追加したい場合は、新しいプロパティにコピーして辞書値コレクションをList<VRate>に抽出するか、コピー/移動するコンバータを作成します。

+0

今、私はboolとdoubleに問題があります。もしvarがjsonでdouble return falseでなければ。私は設定メソッドを変更しようとします:bool isDouble = Double.TryParse(value.ToString()、_reduced_rate); if(isDouble) _reduced_rate = value; else _reduced_rate = 0.0;それでも構文解析のエラーが発生する –

関連する問題