【问题标题】:json to c# deserializationjson转c#反序列化
【发布时间】:2017-03-25 19:07:09
【问题描述】:

我正在寻找如何按颜色将汽车添加到某个列表中。 这是json文件,我用json2csharp生成类。

我想用更好的方法检查每辆车,并列出它们的颜色。例如,如果我有 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)
                {

                }

            }

【问题讨论】:

  • 你能改变json结构吗?
  • @MickyD 好吧,我在这个 foreach 循环中,当我去 c。它向我展示了宝马、奥迪……,然后我需要为每辆车都去,但我不喜欢这种方法。
  • @Darjan 不,我不是。需要为此文件完成。
  • 感谢您编辑问题以添加代码。 +1 :)

标签: c# json list


【解决方案1】:

您可以通过使用System.Reflection 库来实现它,这在一定程度上增加了性能损失,但我认为代码对性能不是很重要,所以你会没事的。

首先,你需要创建一个接口:

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

Car 类应该实现该接口:

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

之后,你可以通过过滤出实现ICar接口的属性来遍历Car对象。

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...
        }
    }
}

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多