1. ホーム
  2. c#

[解決済み] JsonReaderからのJObjectの読み込みに失敗しました。現在のJsonReaderのアイテムはオブジェクトではありません。StartArray. パス

2023-07-21 02:38:46

質問

位置情報を含む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<LocationData>(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<JObject>())
        {
            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.NullValueHandling = NullValueHandling.Ignore;
            settings.MissingMemberHandling = MissingMemberHandling.Ignore;
            var rcvdData = JsonConvert.DeserializeObject<LocationData>(arr.ToString(), settings);
            UpdateMapData(rcvdData);
            UpdateTextData(rcvdData);
        }
    }

これもエラーになります。

現在の JSON 配列をデシリアライズできません (例. [1,2,3] のように)型に 'MMI_SpeechRecog.Model.LocationData' というのは、この型は JSON オブジェクトを必要とするからです (例えば {"name":"value"} ) を必要とするからです。

どのように解決するのですか?

ご質問の最初の部分は、重複している なぜ私はこのコードでJsonReaderExceptionを取得するのですか? の重複ですが、その(私の)回答から最も関連性の高い部分はこれです。

[A] JObject は、JSON.netのすべてのものの基本型ではありません。 JToken はそうです。だから、たとえ、あなたが言うことができても

object i = new int[0];

というのは、C#では

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

をJSON.netに追加しました。

あなたが欲しいのは JArray.Parse で、これは渡された配列を受け取ります (冒頭の [ で示される)配列を受け入れます。これは、エラーメッセージの "StartArray" があなたに伝えていることです。

を使用したときに何が起こったかについてですが JArray を使ったときにどうなったかというと、あなたは arr の代わりに obj :

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

これを入れ替えると、うまくいくはずです。

をデシリアライズしたくなるところですが。 arr を直接 IEnumerable<LocationData> として直接指定することで、コードと配列をループする手間を省くことができます。もし解析されたバージョンを別に使うつもりがないのであれば、避けるのが一番です。