2013-03-31 176 views
0

我有一个JSON字符串(根据验证器)是有效的JSON,我坚持试图解析它作为对象在C#中。无法反序列化JSON

样品字符串:

{"asks":[["49999.99000","20.00000000"],["900.00000","4.00000000"],["100.00000","5.00000000"]],"bids":[["5.40000","15.06500000"],["5.53675","0.50000000"],["5.00000","6.00000000"]]} 

我曾尝试使用http://json2csharp.com/,它表明这个类(没有工作):

public class RootObject 
{ 
    public List<List<string>> asks { get; set; } 
    public List<List<string>> bids { get; set; } 
} 

不过,我想分析它像List<Ask> asks { get; set; }。我曾尝试以下:

public class Orderbook 
{ 
    public List<Ask> asks { get; set; } 
    public List<Bid> bids { get; set; } 
} 

public class Ask 
{ 
    public double amount { get; set; } 
    public double price { get; set; } 
} 

public class Bid 
{ 
    public double amount { get; set; } 
    public double price { get; set; } 
} 

但这种失败类型“namespace.Ask”不支持数组的反序列化。

+0

是不是因为你有字符串数组? – BlackBear

+1

这是因为你试图将数组反序列化为对象。你的一个'ask'的JSON应该是'{“amount”:1231.321,“price”:3123.123}' –

+0

这是我所查询的服务提供的格式。我希望能够轻松地将其转换/转换为我需要的格式。 – leepfrog

回答

1

无需AskBid

var orderBook = JsonConvert.DeserializeObject<Orderbook>(json); //Json.Net 
//OR 
var orderBook = new JavaScriptSerializer().Deserialize<Orderbook>(json); //JavaScriptSerializer 

public class Orderbook 
{ 
    public List<List<string>> asks { get; set; } 
    public List<List<string>> bids { get; set; } 
} 

顺便说一句:值是字符串("49999.99000")不是双

EDIT

asksbids是数组的阵列,所以将它们转换为一个数组concerete类(在反序列化过程中)需要很多技巧(如果可能的话)。你为什么不简单地迭代orderBook来形成你想要的?

var asks = orderBook.asks.Select(a => 
         new Ask { 
          amount = double.Parse(a[0],CultureInfo.InvariantCulture), 
          price = double.Parse(a[1],CultureInfo.InvariantCulture) 
         }).ToList(); 
+0

感谢您指出显而易见的东西(值是字符串),那是我忽略了的东西。 Unfortunateley我无法更改格式,因为这是我正在使用的第三方输出。所以我需要的是一种方法来将这些值转换/加倍 - 这很容易吗? Forthermore我想坚持'Ask'和'Bid',因为这样可以更容易地访问这些属性(比指定数组索引更好)。 – leepfrog

+0

感谢您的编辑。因为我能以这种方式实现它,所以标记为解决方案! – leepfrog