2017-09-14 10 views
0

次のコードを使用してJSONを解析しています。私は例外を得ています。JSONのC#での解析の問題

using System.Collections.Generic; 
using Newtonsoft.Json; 
using RestSharp; 
using WebAutomation.BDD.Data; 

namespace WebAutomation.Utils 
{ 
    public class RestApi 
    { 
     private static IRestResponse HttpGetResponse(string endPoint) 
     { 
      var client = new RestClient(endPoint); 
      var request = new RestRequest(Method.GET); 
      return client.Execute(request); 
     } 

     public static FeaturedMenuItems GetFeaturedMenuItems() 
     { 
      var a = HttpGetResponse("http://<DOMAIN>/api/web/menu/quick"); 
      return JsonConvert.DeserializeObject<FeaturedMenuItems>(a.Content); 
     } 
    } 
} 

私はそれを解析するために以下のクラスを使用しています:

using System.Collections.Generic; 

namespace WebAutomation.BDD.Data 
{ 
    public class FeaturedMenu 
    { 
     public string MenuItemName { get; set; } 
     public string MenuItemName_en { get; set; } 
     public string MenuItemName_zh { get; set; } 
     public string url { get; set; } 
     public string LastModifiedDate { get; set; } 
    } 

    public class FeaturedMenuItems 
    { 
     public List<FeaturedMenu> Featured_Menu { get; set; } 
    } 
} 

これは私が取得JSONです:

[ 
    { 
    "Featured_Menu": [ 
     { 
     "MenuItemName": "Today's Racing", 
     "MenuItemName-en": "Today's Racing", 
     "MenuItemName-zh": "今日赛事", 
     "url": "/racing-betting/today", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "Tomorrow's Racing", 
     "MenuItemName-en": "Tomorrow's Racing", 
     "MenuItemName-zh": "明日赛事", 
     "url": "/racing-betting/tomorrow", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "Upcoming Sports", 
     "MenuItemName-en": "Upcoming Sports", 
     "MenuItemName-zh": "近期赛事", 
     "url": "/sports-betting/next-up", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "Live Centre", 
     "MenuItemName-en": "Live Centre", 
     "MenuItemName-zh": "即场投注", 
     "url": "/live-in-play-betting", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "Multi Express", 
     "MenuItemName-en": "Multi Express", 
     "MenuItemName-zh": "Multi Express", 
     "url": "/multi-express", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "AFL Finals", 
     "MenuItemName-en": "AFL Finals", 
     "MenuItemName-zh": "AFL Finals", 
     "url": "/sports-betting/australian-rules/afl", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "NRL Finals", 
     "MenuItemName-en": "NRL Finals", 
     "MenuItemName-zh": "NRL Finals", 
     "url": "/sports-betting/rugby-league/nrl/nrl-matches", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "MLB Matches", 
     "MenuItemName-en": "MLB Matches", 
     "MenuItemName-zh": "MLB Matches", 
     "url": "/sports-betting/baseball/major-league-baseball/mlb-matches", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "NFL Matches", 
     "MenuItemName-en": "NFL Matches", 
     "MenuItemName-zh": "NFL Matches", 
     "url": "/sports-betting/american-football/nfl/nfl-matches/", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "EPL Matches", 
     "MenuItemName-en": "EPL Matches", 
     "MenuItemName-zh": "EPL Matches", 
     "url": "/sports-betting/soccer/united-kingdom/english-premier-league-matches", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "UEFA Europa League", 
     "MenuItemName-en": "UEFA Europa League", 
     "MenuItemName-zh": "UEFA Europa League", 
     "url": "/sports-betting/soccer/uefa-competitions/europa-league-matches/", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "Golovkin v Alvarez", 
     "MenuItemName-en": "Golovkin v Alvarez", 
     "MenuItemName-zh": "Golovkin v Alvarez", 
     "url": "/sports-betting/boxing/bouts/fights/gennady-golovkin-v-saul-alvarez-20170917-600896-21745986", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "Makybe Diva Stakes", 
     "MenuItemName-en": "Makybe Diva Stakes", 
     "MenuItemName-zh": "Makybe Diva Stakes", 
     "url": "/racing-betting/horse-racing/flemington/20170916/race-7-704632-23756853", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "The Shorts", 
     "MenuItemName-en": "The Shorts", 
     "MenuItemName-zh": "The Shorts", 
     "url": "/racing-betting/horse-racing/randwick/20170916/race-7-704601-23756572", 
     "LastModifiedDate": "20170914111417" 
     }, 
     { 
     "MenuItemName": "Lotto", 
     "MenuItemName-en": "Lotto", 
     "MenuItemName-zh": "Lotto", 
     "url": "/http://crownlotto.com.au", 
     "LastModifiedDate": "20170914111417" 
     } 
    ] 
    } 
] 

私は例外次のようになっています:

Newtonsoft .Json.JsonSerializationException: 'を逆シリアル化できません現在のJSON配列(例: [1,2,3])をタイプ 'WebAutomation.BDD.Data.FeaturedMenuItems'に変換します。タイプには、正しくデシリアライズするために JSONオブジェクト(たとえば、{"name": "value"})が必要なためです。 このエラーを修正するには、JSONオブジェクトをJSONオブジェクト(例: {"name": "value"})に変更するか、またはコレクションインタフェース(ICollection、IListなど)を実装する 型に逆シリアル化タイプを変更してください。 JSON配列から逆シリアル化できるリストのようなものです。 JsonArrayAttributeを型に追加して、 に強制的にJSON配列から逆シリアル化することもできます。パス '、1行目、1位。

私は問題を把握することができません。どんな助力も高く評価されます。

+0

あなたは 'リストにデシリアライズする必要があります'で説明したように、[型にJSON配列(例えば[1,2,3])をデシリアライズすることはできません「」タイプがJSONオブジェクトを必要とするため( {"name": "value"})正しくデシリアライズする](https://stackoverflow.com/q/22557559/3744182)。 – dbc

答えて

0

FeaturedMenuItemsの配列をデシリアライズしようとしていますが、FeaturedMenuItemsではありません。使用してみてください:

JsonConvert.DeserializeObject<FeaturedMenuItems[]>(a.Content) 
+0

出力としてnullが返されています。 – Aby

+0

@Aby申し訳ありませんが、私のコーヒーはまだ持っていませんでした。それを修正しました。配列のアイテムはFeaturedMenuでしたが、FeaturedMenuItemsでした –