将数组列入子类

时间:2014-01-20 23:17:36

标签: c# arrays json api

我有一个带有数组列表的JSON字符串。我想将数组设置为另一个类。

这是我的JSON:

{ "timestamp" : "1390257561" ,
  "bids"      : [ [ "833.98" , "3.14189766" ] ,
                  [ "833.73" , "0.08396004" ] ,
                  [ "833.65" , "9.64222506" ]
                ] ,
  "asks"      : [ [ "834.48" , "0.38622500" ] ,
                  [ "834.60" , "5.47589215" ] ,
                  [ "834.61" , "1.36021122" ]
                ]
}

这是我的班级:

public class OrderBook
{
  public double TimeStamp { get; set; }
  public List<PriceAmount> Bids { get; set; }
  public List<PriceAmount> Asks { get; set; }
}

public class PriceAmount
{
  public decimal Usd { get; set; }
  public decimal Amount { get; set; }
}

无法填充列表中的对象,因为对象PriceAmount是一个数组。要让此代码工作,对象(Array)应该在它们前面有一个名称。例如:

{ "bids" : [ [ "Usd":"833.98" , "Amount":"3.14189766" ] ,
             [ "Usd":"833.73" , "Amount":"0.08396004" ]
           ]
}

如何将列表数组读入子类?

2 个答案:

答案 0 :(得分:2)

我可能会做这样的事情。首先,一个简单的数据结构来保存解析的数据,用一个简单的工厂方法来实例化它:

internal class ParsedJson
{
  public uint                Timestamp { get; set; }
  public List<List<decimal>> Bids      { get; set; }
  public List<List<decimal>> Asks      { get; set; }
  public static ParsedJson CreateInstance( string json )
  {
    ParsedJson instance = Newtonsoft.Json.JsonConvert.DeserializeObject<ParsedJson>( json );
    return instance;
  }
}

然后使用它来引导更接近可用业务对象的东西:

internal class MyData
{
  public static MyData CreateInstance( string json )
  {
    DateTime   unixEpoch = new DateTime( 1970 , 1 , 1 , 0 , 0 , 0 );
    ParsedJson record    = ParsedJson.CreateInstance( json );
    MyData     instance = new MyData
                          {
                            TimeStamp = unixEpoch.AddSeconds( (double)record.Timestamp ) ,
                            Bids      = record.Bids.Select( x => new BidAsk( x[0] , x[1] ) ).ToArray() ,
                            Asks      = record.Bids.Select( x => new BidAsk( x[0] , x[1] ) ).ToArray() ,
                          } ;
    return instance;
  }

  public DateTime TimeStamp { get; private set; }
  public BidAsk[] Bids      { get; private set; }
  public BidAsk[] Asks      { get; private set; }

  private MyData()
  {
    return;
  }

  public class BidAsk
  {
    public decimal Price  { get; private set; }
    public decimal Amount { get; private set; }
    public BidAsk( decimal price , decimal amount )
    {
      this.Price = price;
      this.Amount = amount;
      return;
    }
  }
}

一旦拥有,使用很简单:

class Program
{
  private static void Main( string[] args )
  {
    string json = @"
{ ""timestamp"" : ""1390257561"" ,
  ""bids""      : [ [ ""833.98"" , ""3.14189766"" ] ,
                    [ ""833.73"" , ""0.08396004"" ] ,
                    [ ""833.65"" , ""9.64222506"" ] ,
                  ] ,
  ""asks""      : [ [ ""834.48"" , ""0.38622500"" ] ,
                    [ ""834.60"" , ""5.47589215"" ] ,
                    [ ""834.61"" , ""1.36021122"" ] ,
                  ] ,
}
";
    MyData data = MyData.CreateInstance( json );
    return;
}

答案 1 :(得分:1)

您可以将其反序列化为

public class OrderBook
{
    public double TimeStamp { get; set; }
    public List<List<decimal>> Bids { get; set; }
    public List<List<decimal>> Asks { get; set; }
}

然后将List<List<decimal>>转换为正确的PriceAmount个对象。

相关问题