JObject Parse无法解析具有JSON类型的String

时间:2018-01-10 10:01:25

标签: c# asp.net json parsing

在此方法中,将从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()不起作用。

Debugging Mode

在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字符串或解析方式有问题吗? 谢谢你的帮助!

1 个答案:

答案 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"
}