在此方法中,将从GetDataSetColumns()返回JSON字符串,该字符串从Signage System(Xibo)调用API以获取数据集。我想将它解析为JSON Object。
我用Google搜索了很多次,发现有些人也有同样的问题。但似乎他们的解决方案对我不起作用。例如解析为JArray或String.Trim()
public async Task<String> GetColumnIdByName(int dataSetId, String heading)
{
String columns = await GetDataSetColumns(dataSetId);
columns.Replace("[", "");
columns.Replace("]", "");
columns.TrimStart().TrimEnd();
**JObject json = JObject.Parse(columns);**
Debug.WriteLine(json);
foreach (KeyValuePair<string, JToken> pair in json)
{
if (pair.Key.ToString().Equals("dataSetColumnId"))
{
if(pair.Value.ToString().Equals(heading))
{
return pair.Value.ToString();
}
}
}
return null;
}
这是从GETDataSetColumns方法返回的JSON,并在Debug中显示。 而且我看不出这个JSON字符串中有任何错误。
[
{
"dataSetColumnId": 8,
"dataSetId": 3,
"heading": "item_name",
"dataTypeId": 1,
"dataSetColumnTypeId": 1,
"listContent": null,
"columnOrder": "1",
"formula": null,
"dataType": "String",
"dataSetColumnType": "Value"
},
{
"dataSetColumnId": 9,
"dataSetId": 3,
"heading": "price",
"dataTypeId": 1,
"dataSetColumnTypeId": 1,
"listContent": null,
"columnOrder": "2",
"formula": null,
"dataType": "String",
"dataSetColumnType": "Value"
},
{
"dataSetColumnId": 12,
"dataSetId": 3,
"heading": "category",
"dataTypeId": 1,
"dataSetColumnTypeId": 1,
"listContent": null,
"columnOrder": "3",
"formula": null,
"dataType": "String",
"dataSetColumnType": "Value"
},
{
"dataSetColumnId": 15,
"dataSetId": 3,
"heading": "status",
"dataTypeId": 1,
"dataSetColumnTypeId": 1,
"listContent": null,
"columnOrder": "7",
"formula": null,
"dataType": "String",
"dataSetColumnType": "Value"
}
]
我还通过调试模式检查了变量的值,拥有'\ n'和许多空白空间是否正常?此外,String.Replace和String.TrimStart()不起作用。
在JObject.Parse之后发生异常错误。
Exception thrown: 'Newtonsoft.Json.JsonReaderException' in Newtonsoft.Json.dll
Exception thrown: 'Newtonsoft.Json.JsonReaderException' in mscorlib.dll
An exception of type 'Newtonsoft.Json.JsonReaderException' occurred in mscorlib.dll but was not handled in user code
Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 1, position 1.
我的JSON字符串或解析方式有问题吗? 谢谢你的帮助!
答案 0 :(得分:0)
我找到了这个post
的答案我也在网上找到了其他答案,但所有答案都无效。 他们中的一些人建议定义一个类并将对象反序列化为定义的类。但我认为这不是正确的方法,因为JSON的结构可能是动态的。
我将它转移到JArray并从中检索对象作为JObject。 它有效。 我看到了这些评论,我认为JSON的有效性根本不是我问题的主要内容。
String columns = await GetDataSetColumns(dataSetId);
JArray jArr = (JArray)JsonConvert.DeserializeObject(columns);
foreach (JObject item in jArr)
{
if(heading.Equals(item["heading"].ToString()))
{
return item["dataSetId"].ToString();
}
}
以下是JSON字符串的示例,我按键获取值
{
"dataSetColumnId": 12,
"dataSetId": 3,
"heading": "category",
"dataTypeId": 1,
"dataSetColumnTypeId": 1,
"listContent": null,
"columnOrder": "3",
"formula": null,
"dataType": "String",
"dataSetColumnType": "Value"
}