当JSON变量名无效且根数组在键值对中不存在时,如何在c#中反序列化JSON ?
本文关键字:JSON 反序列化 键值对 无效 变量名 数组 不存在 | 更新日期: 2023-09-27 18:09:07
所以通常会创建一个类甚至嵌套类来反序列化大多数JSON。
然后将JSON提供给JSON。. Net或其他库
我就是这么做的,直到我遇到了这个JSON。
{
"USD" : {"15m" : 609.09, "last" : 609.09, "buy" : 606, "sell" : 609.09, "symbol" : "$"},
"CNY" : {"15m" : 3783.32, "last" : 3783.32, "buy" : 3764.13, "sell" : 3783.32, "symbol" : "¥"},
"JPY" : {"15m" : 62194.06, "last" : 62194.06, "buy" : 61878.54, "sell" : 62194.06, "symbol" : "¥"},
"SGD" : {"15m" : 761.65, "last" : 761.65, "buy" : 757.79, "sell" : 761.65, "symbol" : "$"},
"HKD" : {"15m" : 4721.51, "last" : 4721.51, "buy" : 4697.55, "sell" : 4721.51, "symbol" : "$"},
"CAD" : {"15m" : 663.64, "last" : 663.64, "buy" : 660.28, "sell" : 663.64, "symbol" : "$"},
"NZD" : {"15m" : 711.55, "last" : 711.55, "buy" : 707.94, "sell" : 711.55, "symbol" : "$"},
"AUD" : {"15m" : 648.34, "last" : 648.34, "buy" : 645.05, "sell" : 648.34, "symbol" : "$"},
"CLP" : {"15m" : 337004.93, "last" : 337004.93, "buy" : 335295.25, "sell" : 337004.93, "symbol" : "$"},
"GBP" : {"15m" : 362.9, "last" : 362.9, "buy" : 361.06, "sell" : 362.9, "symbol" : "£"},
"DKK" : {"15m" : 3356.52, "last" : 3356.52, "buy" : 3339.49, "sell" : 3356.52, "symbol" : "kr"},
"SEK" : {"15m" : 4068.99, "last" : 4068.99, "buy" : 4048.35, "sell" : 4068.99, "symbol" : "kr"},
"ISK" : {"15m" : 69486.21, "last" : 69486.21, "buy" : 69133.69, "sell" : 69486.21, "symbol" : "kr"},
"CHF" : {"15m" : 548.15, "last" : 548.15, "buy" : 545.37, "sell" : 548.15, "symbol" : "CHF"},
"BRL" : {"15m" : 1354.87, "last" : 1354.87, "buy" : 1348, "sell" : 1354.87, "symbol" : "R$"},
"EUR" : {"15m" : 450.11, "last" : 450.11, "buy" : 447.83, "sell" : 450.11, "symbol" : "€"},
"RUB" : {"15m" : 20948.52, "last" : 20948.52, "buy" : 20842.25, "sell" : 20948.52, "symbol" : "RUB"},
"PLN" : {"15m" : 1851.37, "last" : 1851.37, "buy" : 1841.98, "sell" : 1851.37, "symbol" : "zł"},
"THB" : {"15m" : 19801.3, "last" : 19801.3, "buy" : 19700.84, "sell" : 19801.3, "symbol" : "฿"},
"KRW" : {"15m" : 619112.58, "last" : 619112.58, "buy" : 615971.73, "sell" : 619112.58, "symbol" : "₩"},
"TWD" : {"15m" : 18274.36, "last" : 18274.36, "buy" : 18181.65, "sell" : 18274.36, "symbol" : "NT$"}
}
第一个问题是根数组不在名称值对中。
第二,"15m"键不是一个有效的c#变量名。(我打算做一个字符串替换到别的东西,但我觉得它太丑了)
这是一个超级简单的解决方案:
using System;
using System.Collections.Generic;
using System.Linq;
using RestSharp;
using RestSharp.Deserializers;
namespace JSONRestTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Requesting data...");
//create new RestSharp Client and tell it the Host
RestClient client = new RestClient("http://blockchain.info");
//Tell it the path and any variables if needed
RestRequest request = new RestRequest("/ticker", Method.GET);
//request.AddParameter("myParameter", myVariable);
//Tell RestSharp to expect JSON
request.RequestFormat = DataFormat.Json;
//Execute the request
IRestResponse response = client.Execute(request);
//Create a JSON Deserializer
JsonDeserializer deserial = new JsonDeserializer();
//Deserialize to a Dictionary Object
Dictionary<string, Rate> jsonObj = deserial.Deserialize<Dictionary<string, Rate>>(response);
//Loop through the Dictionary
foreach (KeyValuePair<string, Rate> currency in jsonObj)
{
Console.WriteLine(currency.Key + " Rate: " + currency.Value.last.ToString());
}
Console.WriteLine("Done...");
}
}
public class Rate
{
public float _15m { get; set; }
public double last { get; set; }
public double buy { get; set; }
public double sell { get; set; }
public string symbol { get; set; }
}
}
诀窍是对所有的非键数据使用Dictionary对象。这解决了第一个问题。
接下来是使用RestSharp,并在有问题的变量前面放一个"_"。