当前位置:  开发笔记 > 编程语言 > 正文

从JsonReader读取JObject时出错.当前的JsonReader项不是对象:StartArray.路径

如何解决《从JsonReader读取JObject时出错.当前的JsonReader项不是对象:StartArray.路径》经验,为你挑选了3个好方法。

我正在开发涉及位置的Windows Phone 8.1应用程序.我从我的API接收Json数据.我的API返回的数据如下所示:

[{
    "country": "India",
    "city": "Mall Road, Gurgaon",
    "area": "Haryana",
    "PLZ": "122002",
    "street": "",
    "house_no": "",
    "POI": "",
    "type": "17",
    "phone": "",
    "lng": 77.08972334861755,
    "lat": 28.47930118040612,
    "formatted_address": "Mall Road, Gurgaon 122002, Haryana, India"
},
{
    "country": "India",
    "city": "Mall Road, Kanpur",
    "area": "Uttar Pradesh",
    "PLZ": "208004",
    "street": "",
    "house_no": "",
    "POI": "",
    "type": "17",
    "phone": "",
    "lng": 80.35783410072327,
    "lat": 26.46026740300029,
    "formatted_address": "Mall Road, Kanpur 208004, Uttar Pradesh, India"
},
{
    "country": "India",
    "city": "Mall Road Area, Amritsar",
    "area": "Punjab",
    "PLZ": "143001",
    "street": "",
    "house_no": "",
    "POI": "",
    "type": "17",
    "phone": "",
    "lng": 74.87286686897278,
    "lat": 31.64115178002094,
    "formatted_address": "Mall Road Area, Amritsar 143001, Punjab, India"
},
{
    "country": "India",
    "city": "Vasant Kunj (Mall Road Kishan Garh), New Delhi",
    "area": "Delhi",
    "PLZ": "110070",
    "street": "",
    "house_no": "",
    "POI": "",
    "type": "18",
    "phone": "",
    "lng": 77.1434211730957,
    "lat": 28.51363217008815,
    "formatted_address": "Vasant Kunj (Mall Road Kishan Garh), New Delhi 110070, Delhi, India"
}]

我正在反序列化我的Json数据并将其放入一个名为的类中LocationData.当我运行我的代码时,它给了我一个错误:

从JsonReader读取JObject时出错.当前的JsonReader项不是对象:StartArray.路径

我哪里错了?这是我的代码:

private async void GetAPIData()
    {
        string _serviceUrl = "https://api.myweblinkapiprovider/v2&q=" + UserRequestedLocation;
        HttpClient client = new HttpClient();

        HttpResponseMessage responce = await client.GetAsync(new Uri(_serviceUrl));

        if (responce.Content != null)
        {
            var respArray = JObject.Parse(await responce.Content.ReadAsStringAsync());
            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.NullValueHandling = NullValueHandling.Ignore;
            settings.MissingMemberHandling = MissingMemberHandling.Ignore;
            var rcvdData = JsonConvert.DeserializeObject(respArray.ToString(), settings);
            UpdateMapData(rcvdData);
            UpdateTextData(rcvdData);
        }
    }

我也尝试过使用JArray.我的代码如下:

 private async void GetAPIData()
    {
        string _serviceUrl = "https://api.myweblinkprovider.com/v3?fun=geocode&lic_key=MyKey" + UserRequestedLocation;
        HttpClient client = new HttpClient();

        HttpResponseMessage responce = await client.GetAsync(new Uri(_serviceUrl));

        JArray arr = JArray.Parse(await responce.Content.ReadAsStringAsync());

        foreach (JObject obj in arr.Children())
        {
            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.NullValueHandling = NullValueHandling.Ignore;
            settings.MissingMemberHandling = MissingMemberHandling.Ignore;
            var rcvdData = JsonConvert.DeserializeObject(arr.ToString(), settings);
            UpdateMapData(rcvdData);
            UpdateTextData(rcvdData);
        }
    }

它也给了我一个错误:

无法将当前JSON数组(例如[1,2,3])反序列化为类型,'MMI_SpeechRecog.Model.LocationData'因为该类型需要JSON对象(例如{"name":"value"})才能正确反序列化.

Matthew Haug.. 72

你问题的第一部分是为什么我用这段代码得到一个JsonReaderException?,但是(我的)答案中最相关的部分是这样的:

[A] JObject不是JSON.net中所有内容的基本类型,但是JToken.所以即使你可以说,

object i = new int[0];

在C#中,你不能说,

JObject i = JObject.Parse("[0, 0, 0]");

在JSON.net.

你想要的是JArray.Parse,它将接受你传递它的数组(用[你的API响应中的开头表示).这就是错误消息中的"StartArray"告诉您的内容.

至于你使用时发生的事情,你使用的JArrayarr代替obj:

var rcvdData = JsonConvert.DeserializeObject(arr /* <-- Here */.ToString(), settings);

交换那个,我相信它应该有效.

虽然我很想arr直接反序列化IEnumerable,这样可以节省一些循环数组的代码和工作量.如果您不打算单独使用解析版本,最好避免使用它.



1> Matthew Haug..:

你问题的第一部分是为什么我用这段代码得到一个JsonReaderException?,但是(我的)答案中最相关的部分是这样的:

[A] JObject不是JSON.net中所有内容的基本类型,但是JToken.所以即使你可以说,

object i = new int[0];

在C#中,你不能说,

JObject i = JObject.Parse("[0, 0, 0]");

在JSON.net.

你想要的是JArray.Parse,它将接受你传递它的数组(用[你的API响应中的开头表示).这就是错误消息中的"StartArray"告诉您的内容.

至于你使用时发生的事情,你使用的JArrayarr代替obj:

var rcvdData = JsonConvert.DeserializeObject(arr /* <-- Here */.ToString(), settings);

交换那个,我相信它应该有效.

虽然我很想arr直接反序列化IEnumerable,这样可以节省一些循环数组的代码和工作量.如果您不打算单独使用解析版本,最好避免使用它.


感谢您的回答。我将分别使用解析后的数据。在这种情况下,它以4个搜索匹配对我做出了回应。我需要分别显示它们,然后根据用户的喜好对每个背景进行显示。
我认为如果要支持所有情况,则应使用JToken,请在此处查看其源代码:http://www.jsonschemavalidator.net/

2> Yohan..:

在这种情况下,您知道在数组的第一个位置包含所有项目,您可以将字符串解析为JArray,然后使用JObject.Parse解析第一个项目

var  jsonArrayString = @"
[
  {
    ""country"": ""India"",
    ""city"": ""Mall Road, Gurgaon"",
  },
  {
    ""country"": ""India"",
    ""city"": ""Mall Road, Kanpur"",
  }
]";
JArray jsonArray = JArray.Parse(jsonArrayString);
dynamic data = JObject.Parse(jsonArray[0].ToString());


没有理由再次重新序列化和解析嵌套的JSON对象.如果您希望数组中的项目作为对象,请执行`var jsonObjects = jsonArray.OfType ().ToList();`

3> 小智..:

我的Xamarin Windows Phone 8.1应用程序遇到了非常相似的问题。JObject.Parse(json)对我不起作用的原因是因为我的Json的开头是“ [”,结尾是“]”。为了使其正常工作,我不得不删除了这两个字符。从您的示例看来,您可能遇到了相同的问题。

jsonResult = jsonResult.TrimStart(new char[] { '[' }).TrimEnd(new char[] { ']' });

然后,我能够使用JObject.Parse(jsonResult),并且一切正常。

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有