2012-12-05 7 views
6

JSONを使って作業するのは非常に新しく、APIからのリターンを扱っていますが、書式を変更することはできません。リターンの例は次のとおりです。(実際のURLは削除されている)JSONをインデックス付き配列でデシリアライズする#

{ 
"body": 
    { 
    "link": 
     {"linkurl": ["www.google.com"]} 
    }, 
"error": null, 
"message": "Data Retrieved successfully", 
"status": true 
} 

私はVS2010で、MVC 3でNewtonsoft.Jsonライブラリを使用しています。

私のクラスには、次のとおりです。

[JsonObject(MemberSerialization.OptIn)] 
    public class LinksJSON 
    { 
     [JsonProperty] 
     public string link{ get; set; } 

     [JsonProperty] 
     public string message { get; set; } 

     [JsonProperty] 
     public string error { get; set; } 

     [JsonProperty] 
     public bool status { get; set; } 
    } 

私はそれをデシリアライズしています:私はLink内のインデックス付きの配列ですlinkurlの値を、取得しようとしているが

private static T _download_serialized_json_data<T>(string url) where T : new() 
    { 
     using (var w = new WebClient()) 
     { 
      var json_data = string.Empty; 
      // attempt to download JSON data as a string 
      try 
      { 
       json_data = w.DownloadString(url); 
      } 
      catch (Exception) { } 
      // if string with JSON data is not empty, deserialize it to class and return its instance 
      return !string.IsNullOrEmpty(json_data) ? JsonConvert.DeserializeObject<T>(json_data) : new T(); 
     } 
    } 

    public string CheckJSONLink() 
    { 

     var url = "<api url-removed for security>"; 

     var outObj = _download_serialized_json_data<LinksJSON>(url); 



     return outObj.Link; 
    } 

どうすればこの情報にアクセスできますか?

+0

ところで、私は他のすべてのフィールド(問題はないとのエラーメッセージとステータス)にアクセスすることができます。 – Crossems

答えて

1

あなたは以下のクラスを使用する必要があります。

[JsonObject(MemberSerialization.OptIn)] 
public class LinksJSON 
{ 
    [JsonProperty] 
    public body body { get; set; } 

    [JsonProperty] 
    public string message { get; set; } 

    [JsonProperty] 
    public string error { get; set; } 

    [JsonProperty] 
    public bool status { get; set; } 
} 

[JsonObject(MemberSerialization.OptIn)] 
public class body 
{ 
    [JsonProperty] 
    public link link { get; set; } 
} 

[JsonObject(MemberSerialization.OptIn)] 
public class link 
{ 
    [JsonProperty] 
    public string[] linkurl { get; set; } 
} 
+0

これは私がやってしまったものです: [JsonObject(MemberSerialization.OptIn)] パブリッククラスLinksJSON { [JsonProperty] 公共bodylinkdetails本体上記と同様。 [JsonProperty] パブリックブール状態。 [JsonProperty] パブリック文字列メッセージ。 [JsonProperty] パブリック文字列エラー。 }パブリッククラスbodylinkdetails {パブリックリンクリンク。 } publicクラスリンク {パブリック文字列[] linkurl。 } – Crossems

2

JSONと一致するようにクラスをセットアップしていないと、クラスにはlinkが単純な文字列であると表示されます。例では複雑なタイプとして表示されています。

期待どおりに適切にデシリアライズするには、JSONと一致するようにクラスを変更する必要があります。具体的には、linkはクラスのインスタンスである必要があります。

+0

この回答をお寄せいただきありがとうございます。チームメンバーとのディスカッションを開始し、適切なクラス構造を使用してデシリアライズしてください。 – Crossems

関連する問題