2012-03-01 8 views
3

SmartyStreets JSON LiveAddress APIを使用しようとしていますが、いくつかの問題があります。私はJSONにあまり慣れていないことを認めます。とにかく、いくつかの方法を試しましたが、通常は「JSON配列をタイプメタデータに逆シリアル化できません」というエラーが発生します。私はクラスを作成するjsontocsharp Webアプリケーションを使用SmartyStreets JSONをJSON.Netで消費しようとしています... "JSON配列をタイプコンポーネントに逆シリアル化できません"

[{"input_index":0,"candidate_index":0,"delivery_line_1":"1600 Amphitheatre Pkwy","last_line":"Mountain View CA 94043-1351","delivery_point_barcode":"940431351000","components":{"primary_number":"1600","street_name":"Amphitheatre","street_suffix":"Pkwy","city_name":"Mountain View","state_abbreviation":"CA","zipcode":"94043","plus4_code":"1351","delivery_point":"00","delivery_point_check_digit":"0"},"metadata":{"record_type":"S","county_fips":"06085","county_name":"Santa Clara","carrier_route":"C058","congressional_district":"14"},"analysis":{"dpv_match_code":"Y","dpv_footnotes":"AABB","dpv_cmra":"N","dpv_vacant":"N","ews_match":false,"footnotes":"N#"}}] 

:ここ

はJSON文字列です。

using (var webClient = new WebClient()) 
     { 
      var json = webClient.DownloadString("url"); 

      var md = JsonConvert.DeserializeObject<Metadata>(json); 
      litTest.Text = md.county_name; 
     } 

その後、私は上記のエラーがスローされます。ここでは

は、私が使用しているコードです。

ご協力いただければ幸いです。ここで

dynamic jsonObj = JsonUtils.JsonObject.GetDynamicJsonObject(json); 
foreach(var item in jsonObj) 
{ 
    Console.WriteLine(item.delivery_line_1 + ", " + 
         item.last_line + ", " + 
         item.metadata.county_name + ", " + 
         item.components.street_name + ", " + 
         item.components.city_name ); 

} 

Dynamic Json Objectのソースです:

は私が

のようなこれらのケースでdynamicオブジェクト(醜いクラスを作成する必要がありません)を使用することを好む、 アンドリュー

答えて

4

をありがとう(をプロジェクトに貼り付けてください)some samples

PS:これはあなたのJSON文字列は、より読みやすい形式である

[ 
    { 
     "input_index": 0, 
     "candidate_index": 0, 
     "delivery_line_1": "1600 Amphitheatre Pkwy", 
     "last_line": "Mountain View CA 94043-1351", 
     "delivery_point_barcode": "940431351000", 
     "components": { 
      "primary_number": "1600", 
      "street_name": "Amphitheatre", 
      "street_suffix": "Pkwy", 
      "city_name": "Mountain View", 
      "state_abbreviation": "CA", 
      "zipcode": "94043", 
      "plus4_code": "1351", 
      "delivery_point": "00", 
      "delivery_point_check_digit": "0" 
     }, 
     "metadata": { 
      "record_type": "S", 
      "county_fips": "06085", 
      "county_name": "Santa Clara", 
      "carrier_route": "C058", 
      "congressional_district": "14" 
     }, 
     "analysis": { 
      "dpv_match_code": "Y", 
      "dpv_footnotes": "AABB", 
      "dpv_cmra": "N", 
      "dpv_vacant": "N", 
      "ews_match": false, 
      "footnotes": "N#" 
     } 
    } 
] 
+0

これは素晴らしいことです。私は間違いなくダイナミックなクラスを詳しく見なければなりません。ダイナミックJsonオブジェクトとその例を指してくれてありがとう...本当に私を助けてくれました! – ajtatum

+0

ようこそ。 –

+0

@ L.Bどのようにフォーマットしましたか? –

3

私はSmartyStreetsの開発者です - 私たちのサービスを利用するためのおかげで!

JSONレスポンスは、1つではなく、アドレスオブジェクトの配列です。これは、アドレスが曖昧であり、消費者による選択/確認を必要とするためである。

だから、あなたは(あなたが動作しない、直接メタデータを解析しようとしていたトップレベルのアドレスオブジェクトとしてJSONをデシリアライズして、メタデータを取得するために、各アドレスに横断するJson.Netを伝える必要があることを意味返された配列内の各アドレスに1つのメタデータセクションがあるためです)。これは基本的にL.Bが答えていることですが、ダイナミックを使用するために余分なオーバーヘッドが追加されている点が異なります。

namespace JsonFun 
{ 
    using System; 
    using System.Net; 
    using Newtonsoft.Json; 

    class Program 
    { 
     private const string Url = "https://api.qualifiedaddress.com/street-address/?street=1600%20Amphitheatre%20Parkway&street2=&city=Mountain%20View&state=CA&zipcode=94043&candidates=10&auth-token=YOUR_AUTH_TOKEN_HERE"; 

     static void Main() 
     { 
      using (var webClient = new WebClient()) 
      { 
       var json = webClient.DownloadString(Url); 

       var candidate_addresses = JsonConvert.DeserializeObject<CandidateAddress[]>(json); 
       foreach (var item in candidate_addresses) 
        Console.WriteLine(item.metadata.county_name); 

       Console.ReadLine(); 
      } 
     } 
    } 

    public class CandidateAddress 
    { 
     public int input_index { get; set; } 
     public int candidate_index { get; set; } 
     public string delivery_line_1 { get; set; } 
     public string last_line { get; set; } 
     public string delivery_point_barcode { get; set; } 
     public Components components { get; set; } 
     public Metadata metadata { get; set; } 
     public Analysis analysis { get; set; } 
    } 

    public class Components 
    { 
     public string primary_number { get; set; } 
     public string street_name { get; set; } 
     public string street_suffix { get; set; } 
     public string city_name { get; set; } 
     public string state_abbreviation { get; set; } 
     public string zipcode { get; set; } 
     public string plus4_code { get; set; } 
     public string delivery_point { get; set; } 
     public string delivery_point_check_digit { get; set; } 
    } 

    public class Metadata 
    { 
     public string record_type { get; set; } 
     public string county_fips { get; set; } 
     public string county_name { get; set; } 
     public string carrier_route { get; set; } 
     public string congressional_district { get; set; } 
     public double latitude { get; set; } 
     public double longitude { get; set; } 
     public string precision { get; set; } 
    } 

    public class Analysis 
    { 
     public string dpv_match_code { get; set; } 
     public string dpv_footnotes { get; set; } 
     public string dpv_cmra { get; set; } 
     public string dpv_vacant { get; set; } 
     public bool ews_match { get; set; } 
     public string footnotes { get; set; } 
    } 
} 

だから、最後に、それはあなたが静的に型付けされた応答オブジェクトまたは動的なものに仕事をしたいかどうかに依存します:

はここにあなたの質問から同じ「DeserializeObject」を使用する代替ソリューションです。がんばろう!

EDIT:サンプルレスポンス(新しくリリース)の緯度/経度フィールドが含まれています。

+0

ダイナミックな解釈の問題のため、これは良い方法です。私は洞察に感謝します。 – IAmTimCorey

関連する問題