2017-03-25 18 views
2

私はいくつかのリストに車種を追加する方法を探しています。 これはjsonファイルです。クラスを生成するためにjson2csharpを使用しました。json to c#deserialization

私はより良い方法を使用してすべての車とその色のリストをチェックしたいと思います。例えば40台の車があれば恐ろしいです。

JSON

{ 
     "cars":[ 
      { 
      "bmw":{ 
       "color":[ 
        "blue", 
        "red" 
       ] 
      }, 
      "price":5 
      }, 
      { 
      "audi":{ 
       "color":[ 
        "blue", 
        "yellow", 
        "white" 
       ] 
      }, 
      "price":7 
      }, 
      { 
      "nil":"nil" 
      }, 
      { 
      "peugeot":{ 
       "color":[ 
        "blue", 
        "red", 
        "yellow", 
        "orange" 
       ] 
      }, 
      "price":12 
      }, 
      { 
      "ferrari":{ 
       "color":[ 
        "blue", 
        "yellow", 
        "orange" 
       ] 
      }, 
      "price":12 
      } 
     ] 
    } 

コード

public class Bmw 
{ 
    public List<string> color { get; set; } 
} 

public class Audi 
{ 
    public List<string> color { get; set; } 
} 

public class Peugeot 
{ 
    public List<string> color { get; set; } 
} 

public class Ferrari 
{ 
    public List<string> color { get; set; } 
} 

public class Car 
{ 
    public Bmw bmw { get; set; } 
    public int price { get; set; } 
    public Audi audi { get; set; } 
    public string nil { get; set; } 
    public Peugeot peugeot { get; set; } 
    public Ferrari ferrari { get; set; } 
} 

public class RootObject 
{ 
    public List<Car> cars { get; set; } 
} 

using (StreamReader r = new StreamReader("carDB.json")) 
      { 
       string json = r.ReadToEnd(); 

       RootObject car = JsonConvert.DeserializeObject<RootObject>(json); 

       foreach(Car c in car.cars) 
       { 

       } 

      } 
+0

json構造を変更できますか? –

+0

@MickyD まあ、私はこのforeachループに入っています。それは私にBMW、アウディを示す...そして、私はすべての車のために行く必要があるだろうが、私はそのアプローチが気に入らない。 – hurms

+0

@ダルヤン いいえ私はそうではありません。このファイルを処理する必要があります。 – hurms

答えて

0

はあなたがある程度のパフォーマンスの低下を追加System.Reflectionライブラリを使用してそれを達成することができますが、私はそうあなたがよ、コードがパフォーマンス重要ではないと仮定大丈夫です。あなたがプロパティをフィルタリングすることでCarオブジェクトを通過することができ、その後

public class Bmw : ICar 
{ 
    public List<string> color { get; set; } 
} 

:クラスは、そのインタフェースを実装する必要があり

public interface ICar 
{ 
    List<string> color { get; set;} 
} 

車:すべての

まず、あなたはインターフェイスを作成する必要がありますどのタイプがICarインターフェイスを実装しています。

RootObject root = JsonConvert.DeserializeObject<RootObject>(json); 
foreach (var car in root.cars) 
{ 
    var carProperties = car.GetType().GetProperties().Where(p => typeof(ICar).IsAssignableFrom(p.PropertyType)); 
    foreach (var carType in carProperties) 
    { 
     var c = carType.GetValue(car); 
     if (c != null) 
     { 
      var colors = ((ICar)c).color; 
      //Do your thing... 
     } 
    } 
} 
+0

ありがとう、魅力的な作品:) – hurms