这是我从一个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)来覆盖名称。 –