我一直在使用JSON。. NET之前,我又卡住了,感谢我的最后一个问题,你们帮助我,我成功地完成了我的项目:但是现在我需要反序列化一段没有键的JSON。是的,但它是一个整数,它可以在0到50之间变化,这意味着我不知道怎么做。我试着用字典,但失败得很惨……这里是JSON:
{
"response": {
"success": 1,
"current_time": 1362339098, // this will return the time when cache was generated
"prices": {
"35": { // defindex
"11": { // quality
"0": { // price index ( crate # or unusual effect, 0 when not used )
"current": { // current price
"currency": "keys",
"value": 39,
"value_high": 41,
"date": 1357515306 // date when the price was updated
},
"previous": { // previous price
"currency": "keys",
"value": 37,
"value_high": 39
}
}
},
"3": { // quality
"0": { // price index
"current": {
"currency": "metal",
"value": 0.33,
"value_high": 0.66
}
}
}
},
"5002": { // refined metal, useful for converting usd prices into metal
"6": {
"0": {
"current": {
"currency": "usd",
"value": 0.39,
"value_high": 0.42,
"date": 1358090106
}
}
}
},
"5022": { // one of the crate defindex
"6": {
"1": { // crate #1
"current": {
"currency": "metal",
"value": 1.33,
"value_high": 1.55,
"date": 1357515175
}
}
}
}
}
}
}
(Dat格式…再一次…)
这是我可悲的尝试:
public class Json1 {
public Json2 response { get; set; }
}
public class Json2 {
public int success { get; set; }
public string current_time { get; set; }
public IDictionary<int, Json3> prices { get; set; }
}
public class Json3 {
}
public class Json4 {
}
public class Json5 {
public Json6 current { get; set; }
}
public class Json6 {
public string currency { get; set; }
public string value { get; set; }
public string value_high { get; set; }
}
Json 3和4是空的,因为我不断删除以尝试不同的东西…
但是的…我已经习惯json了,但不明白这个。如有任何友好的回复,我们将不胜感激。
(我知道我在一些浮点数和长数上使用了字符串,这是故意的,但我想可以改变)
我个人使用Newtonsoft。Json非常好,您可以在http://json.codeplex.com/找到它它处理匿名类型和许多其他东西之间的linq。
也有很好的文档。你应该没事的:
只是一个简单的例子:
serialize:var listId = new List<int>();
listId.Add(1);
listId.Add(2);
listId.Add(3);
String jsonList = JsonConvert.SerializeObject(listId);
反序列化:
List<int> listID = JsonConvert.DeserializeObject<List<int>>(JsonListOfID);
你对IDictionary
的看法是正确的。这个JSON结构实际上是一堆嵌套的字典。试着让你的类像这样:
public class Json1
{
public Json2 response { get; set; }
}
public class Json2
{
public int success { get; set; }
public string current_time { get; set; }
public IDictionary<int, IDictionary<int, IDictionary<int, Json5>>> prices { get; set; }
}
public class Json5
{
public Json6 current { get; set; }
}
public class Json6
{
public string currency { get; set; }
public string value { get; set; }
public string value_high { get; set; }
}
你可以像这样反序列化它:
Json1 obj = JsonConvert.DeserializeObject<Json1>(json);
一旦你对它进行了反序列化,你就可以得到这样的值:
foreach (KeyValuePair<int, IDictionary<int, IDictionary<int, Json5>>> price in obj.response.prices)
{
Console.WriteLine("price index: " + price.Key);
foreach (KeyValuePair<int, IDictionary<int, Json5>> quality in price.Value)
{
Console.WriteLine("t quality: " + quality.Key);
foreach (KeyValuePair<int, Json5> index in quality.Value)
{
Console.WriteLine("tt index: " + index.Key);
Console.WriteLine("ttt currency: " + index.Value.current.currency);
Console.WriteLine("ttt value: " + index.Value.current.value);
Console.WriteLine("ttt value_high: " + index.Value.current.value_high);
}
}
}
上面的输出(显示它有效):
price index: 35
quality: 11
index: 0
currency: keys
value: 39
value_high: 41
quality: 3
index: 0
currency: metal
value: 0.33
value_high: 0.66
price index: 5002
quality: 6
index: 0
currency: usd
value: 0.39
value_high: 0.42
price index: 5022
quality: 6
index: 1
currency: metal
value: 1.33
value_high: 1.55
如果你有visual studio 2012,你可以做Edit -> Paste Special -> Paste JSON as Classes,用你的JSON生成这个。虽然在这种情况下,这可能不会帮助您,因为属性名称是动态的。也许结构有帮助。另一种选择可能是将响应解析为JToken,然后使用linq获取数据。
public class Rootobject
{
public Response response { get; set; }
}
public class Response
{
public int success { get; set; }
public int current_time { get; set; }
public _35 _35 { get; set; }
public _5002 _5002 { get; set; }
public _5022 _5022 { get; set; }
}
public class _35
{
public _11 _11 { get; set; }
public _3 _3 { get; set; }
}
public class _11
{
public _0 _0 { get; set; }
}
public class _0
{
public Current current { get; set; }
public Previous previous { get; set; }
}
public class Current
{
public string currency { get; set; }
public int value { get; set; }
public int value_high { get; set; }
public int date { get; set; }
}
public class Previous
{
public string currency { get; set; }
public int value { get; set; }
public int value_high { get; set; }
}
public class _3
{
public _01 _0 { get; set; }
}
public class _01
{
public Current1 current { get; set; }
}
public class Current1
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
}
public class _5002
{
public _6 _6 { get; set; }
}
public class _6
{
public _02 _0 { get; set; }
}
public class _02
{
public Current2 current { get; set; }
}
public class Current2
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
public int date { get; set; }
}
public class _5022
{
public _61 _6 { get; set; }
}
public class _61
{
public _1 _1 { get; set; }
}
public class _1
{
public Current3 current { get; set; }
}
public class Current3
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
public int date { get; set; }
}