這是我從一個GET請求接收的JSON對象:在C#中解析這個JSON對象的正確方法是什麼?
{
"data": {
"valve_maker": [],
"water_volume": [
"15L",
"20L",
"..."
],
"cylinder_manufacturer": [
"Tianhai"
],
"qc_stamp": [
"TS"
],
"reference_standard": [
"GB 5099"
],
"production_licence": [
"TS2210752-2016"
],
"valve_production_licence": [
"TSF210030"
],
"rate_of_residual_deformation": {
"1": "<3%",
"2": "<10%"
},
"material_number": {
"1": "30CrMo",
"2": "34CrMo4",
"3": "..."
},
"heat_treatment": {
"1": "...",
"2": "..."
},
"drawing_number": {
"1": "...",
"2": "..."
},
"cylinder_thickness": []
}
現在,我能夠解析JSON對象與像更簡單的結構:
{
"data": [
{
"gas_id": "ID of the gas",
"gas_name": "Gas name"
}
]
通過使用這樣的事情:
private void jsonparsegas(string res)
{
JObject par = JObject.Parse(res);
foreach (JToken data in par["data"].Children())
{
string id = data["gas_id"].ToString();
string name = data["gas_name"].ToString();
if (this.cmbCylType.Items.Contains(name) == false)
{
this.cmbCylType.Items.Add(name);
}
}
}
當我嘗試運用同樣的事情更復雜的JSON對象,我得到一個錯誤:
private void jsonparsecoc(string res)
{
//JObject par = JObject.Parse(res);
var jObj = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(res);
foreach (var child in jObj["data"].Children())
{
string vMaker = child["valve_maker"].ToString(); //error thrown here right away
string wVolume = child["water_volume"].ToString();
string cMan = child["cylinder_manufacturer"].ToString();
string QC = child["qc_stamp"].ToString();
string rStandard = child["reference_standard"].ToString();
string pLicence = child["production_licence"].ToString();
string VPL = child["valve_production_licence"].ToString();
string rrd = child["rate_of_residual_deformation"].ToString();
string mNum = child["material_number"].ToString();
string hTreatment = child["heat_treatment"].ToString();
string dNum = child["drawing_number"].ToString();
string cThick = child["cylinder_thickness"].ToString();
}
Cannot access child value on Newtonsoft.Json.Linq.JProperty
我已經嘗試了一些不同的東西,我在計算器上找到,但我真的不理解對象的反序列化是如何工作的。更簡單的解析工作很好,並允許我將從GET請求收到的所有「gas_name」添加到組合框。 「數據」的第一個「valve_maker」孩子的格式似乎與更類似的JSON對象中的「gas_id」或「gas_name」具有相同的結構,但這是我立即收到錯誤的地方。如果我在爲錯誤的原因猜測,我會說這有什麼用
"valve_maker": []
,並使用
中的對象"gas_id": "ID of the gas"
之間做的差。另外我注意到「數據」後面跟着更簡單的括號,而更復雜的是{}。
如果任何人都可以鏈接到一些很好的閱讀材料,或提供一個解決方案/發生了什麼的好解釋,我真的很感激。
{}是c#中的一個類,[]是一個數組,一個集合,一個列表,[{},{},{}]是一個類的數組,{'array':[]}是一個具有數組屬性的類.... –
通常我會說使用http://json2csharp.com/產生一個類結構,然後我們e通用'DeserializeObject <>()'簽名來創建一個強類型的結構化結果。但是,您的示例輸入在其中包含一些數字作爲屬性的名稱,這在C#對象中是不允許的。這些類型的對象是否具有固定的結構,或者它們是否具有任意數量的屬性? – StriplingWarrior
@StriplingWarrior您可以使用[一個屬性](http://www.newtonsoft.com/json/help/html/serializationattributes.htm)來覆蓋名稱。 –