Newtonsoft.Jsonを使ってJSONをデシアライズしようとしてますが、上手くできません。
ビルドはうまくいきますが、以下の例外エラーが出てしまいます。
JSONの読み込みは上手くできています。
**Newtonsoft.Json.JsonSerializationException:** 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[BEStatus.ShopItem]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. Path 'error', line 1, position 9.'
JSONに変換する部分はこのように書きました。
C#
1using System; 2using System.Collections.Generic; 3using System.Diagnostics; 4using System.Text; 5using System.Net.Http; 6using Newtonsoft.Json; 7using System.Threading.Tasks; 8using System.Runtime.Serialization.Json; 9 10namespace BEStatus 11{ 12 class GetApiData 13 { 14 //API情報 15 public string Token = "(Token key)"; 16 public string Store_URL = "https://--"; 17 18 //アイテムショップの処理 19 public List<ShopItem> ShopList; 20 public async Task<List<ShopItem>> ShopItemAsync() 21 { 22 //List作成 23 ShopList = new List<ShopItem>(); 24 HttpClient httpClient = new HttpClient(); 25 httpClient.DefaultRequestHeaders.Add("Authorization", Token); 26 //非同期でAPI取得 27 Task<string> stringAsync = httpClient.GetStringAsync(Store_URL); 28 string result = await stringAsync; 29 Debug.WriteLine(result); 30 //Jsonに変換 31 ShopList = JsonConvert.DeserializeObject<List<ShopItem>>(result); 32 //Listでreturn 33 return ShopList; 34 35 } 36 } 37 38 39 public class ShopImages 40 { 41 public string icon { get; set; } 42 public string background { get; set; } 43 public string featured { get; set; } 44 public string fbackground { get; set; } 45 } 46 47 public class ShopItem 48 { 49 public string name { get; set; } 50 public string rarity { get; set; } 51 public string type { get; set; } 52 public ShopImages images { get; set; } 53 } 54 55 public class ShopStore 56 { 57 public int cost { get; set; } 58 public int regularCost { get; set; } 59 public bool isFeatured { get; set; } 60 public bool isNew { get; set; } 61 public bool isCommunityVote { get; set; } 62 } 63 64 public class ShopDatum 65 { 66 public string itemId { get; set; } 67 public ShopItem item { get; set; } 68 public ShopStore store { get; set; } 69 } 70 71 public class ShopRootObject 72 { 73 public List<ShopDatum> data { get; set; } 74 public int updateAt { get; set; } 75 } 76}
下のコードはリストを表示させるためのコードです(Xamarin)
C#
1using System; 2using System.Collections.Generic; 3using System.Net.Http; 4using Newtonsoft.Json; 5using System.Threading.Tasks; 6using System.Runtime.Serialization.Json; 7using System.Text; 8using Xamarin.Forms; 9using Xamarin.Forms.Xaml; 10 11namespace BEStatus 12{ 13 [XamlCompilation(XamlCompilationOptions.Compile)] 14 public partial class TodayItemShop : ContentPage 15 { 16 17 public ListView listView; 18 public List<ShopItem> ShopList; 19 20 public TodayItemShop() 21 { 22 //リストのデザイン系 23 InitializeComponent(); 24 25 listView = new ListView 26 { 27 RowHeight = 60 28 }; 29 Content = new StackLayout 30 { 31 VerticalOptions = LayoutOptions.FillAndExpand, 32 Children = { listView } 33 }; 34 35 fetchArticles(new GetApiData()); 36 } 37 38 //非同期でデータ取得 39 async void fetchArticles(GetApiData Api) 40 { 41 42 ShopList = await Api.ShopItemAsync(); 43 var items = new List<String>(); 44 foreach (ShopItem value in ShopList) 45 { 46 items.Add(value.name); 47 } 48 listView.ItemsSource = items; 49 } 50 } 51} 52
読み込むJSONの文字列はこんな感じです。
JSON
1{ 2 "data": [ 3 { 4 "itemId": "ID", 5 "item": { 6 "name": "Sunrise", 7 "rarity": "rare", 8 "type": "glider", 9 "images": { 10 "icon": "URL", 11 "background": "URL", 12 "featured": "URL", 13 "fbackground": "URL" 14 } 15 }, 16 "store": { 17 "cost": 800, 18 "regularCost": 800, 19 "isFeatured": true, 20 "isNew": false, 21 "isCommunityVote": false 22 } 23 }, 24 { 25 "itemId": "ID", 26 "item": { 27 "name": "Sky Stripe", 28 "rarity": "uncommon", 29 "type": "glider", 30 "images": { 31 "icon": "URL", 32 "background": "URL", 33 "featured": "URL", 34 "fbackground": "URL" 35 } 36 }, 37 "store": { 38 "cost": 500, 39 "regularCost": 500, 40 "isFeatured": true, 41 "isNew": false, 42 "isCommunityVote": false 43 } 44 }, 45 { 46 "itemId": "ID", 47 "item": { 48 "name": "Axetec", 49 "rarity": "rare", 50 "type": "pickaxe", 51 "images": { 52 "icon": "URL", 53 "background": "URL", 54 "featured": "URL", 55 "fbackground": "URL" 56 } 57 }, 58 "store": { 59 "cost": 800, 60 "regularCost": 800, 61 "isFeatured": true, 62 "isNew": false, 63 "isCommunityVote": false 64 } 65 }, 66 { 67 "itemId": "ID", 68 "item": { 69 "name": "Stripe Slicer", 70 "rarity": "uncommon", 71 "type": "pickaxe", 72 "images": { 73 "icon": "URL", 74 "background": "URL", 75 "featured": "URL", 76 "fbackground": "URL" 77 } 78 }, 79 "store": { 80 "cost": 500, 81 "regularCost": 500, 82 "isFeatured": true, 83 "isNew": false, 84 "isCommunityVote": false 85 } 86 }, 87 { 88 "itemId": "ID", 89 "item": { 90 "name": "Iron Beak", 91 "rarity": "rare", 92 "type": "pickaxe", 93 "images": { 94 "icon": "URL", 95 "background": "URL", 96 "featured": "URL", 97 "fbackground": "URL" 98 } 99 }, 100 "store": { 101 "cost": 800, 102 "regularCost": 800, 103 "isFeatured": true, 104 "isNew": false, 105 "isCommunityVote": false 106 } 107 108 109 } 110 ], 111 "updateAt": 1570406481 112}
JSONはあまり触ったことがないので初歩的な質問かもしれませんが、回答よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー