2016-10-06 6 views
0

以下のようにAsana APIでuser/me呼び出しから取得したデータを逆シリアル化しようとしていますが、オブジェクトはjsonResponse var。データがそこにあります - それを私が純粋なテキストとして読むと私はそれを見ることができます。また、DataContractJsonSerializerの代わりにJsonSerializerで[DataMember]の代わりに[JsonProperty( "id")]属性を使用してみましたが、例外が発生しました。 "タイプ 'Newtonsoft.Json.Linq.JObjectのオブジェクトをキャストすることができません'を入力して' Data2 'を入力してください。 "AsanaユーザーデータをC#クラスに逆シリアル化できません

私は間違っていますか?

注:私はXamasoft JSON Class Generatorを使用してクラスを作成しています。 GetUserメソッドの下のクラスを参照してください。

 public AsanaObjects.Data2 GetUser() 
    { 
     AsanaObjects.Data2 result = null; 
     string url = "https://app.asana.com/api/1.0/users/me"; 

     try 
     { 
      var uri = new Uri(url); 
      ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CertificateCheck); 
      //ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3; 
      //Must use Tls12 or else exception: "The underlying connection was closed: An unexpected error occurred on a send." InnerException = {"Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host."} 
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

      var webRequest = (HttpWebRequest)WebRequest.Create(uri); 
      webRequest.Timeout = 10000; 
      webRequest.Method = "GET"; webRequest.ContentType = "application/x-www-form-urlencoded"; 
      webRequest.Accept = "application/json"; 
      //webRequest.UseDefaultCredentials = true; //doesn't seem to make a difference 
      webRequest.Headers.Add("Authorization", "Bearer " + AsanaBroker.Properties.Settings.Default.AccessToken); 

      using (var response = webRequest.GetResponse()) 
      { 
       //using (var responseStream = ((HttpWebResponse)response).GetResponseStream()) 
       //{ 
       // if (responseStream != null) 
       // { 
       //  var reader = new System.IO.StreamReader(responseStream); 
       //  string readerText = reader.ReadToEnd(); 
       //  //Example return data: {"data":{"id":12343281337970,"name":"Eric Legault","email":"[email protected]","photo":null,"workspaces":[{"id":1234250096894,"name":"foo"},{"id":123446170860,"name":"Personal Projects"},{"id":12345000597911,"name":"foo2"}]}} 
       // } 
       //} 
       using (var responseStream = ((HttpWebResponse)response).GetResponseStream()) 
       { 
        if (responseStream != null) 
        { 
         try 
         { 
          AsanaObjects.Data2 jsonResponse = null; 
          var jsonSerializer = new DataContractJsonSerializer(typeof(AsanaObjects.Data2)); 
          jsonResponse = jsonSerializer.ReadObject(responseStream) as AsanaObjects.Data2; 

          if (jsonResponse != null) 
          { 
           result = jsonResponse; 
          } 
         } 
         catch (Exception ex) 
         { 
          Log.Error(ex); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
     } 

     return result; 
    } 

これは私が(最初のフォーマットされていない部分は申し訳ありません - 修正する方法がわからない)にデシリアライズしようとしているクラスです。

公共部分クラスのAsanaObjects { [のDataContract] publicクラスワークスペース { [DataMember] パブリックオブジェクトID {get;セット; }

 [DataMember] 
     public string name { get; set; } 
    } 
} 

public partial class AsanaObjects 
{ 
    [DataContract] 
    public class Data2 
    { 
     [DataMember] 
     public long id { get; set; } 

     [DataMember] 
     public string name { get; set; } 

     [DataMember] 
     public string email { get; set; } 

     [DataMember] 
     public object photo { get; set; } 

     [DataMember] 
     public Workspace[] workspaces { get; set; } 
    } 
} 

public partial class AsanaObjects 
{ 
    [DataMember] 
    public Data2[] data { get; set; } 
} 
+1

は、あなたが得る生のコンテンツ/ JSONを投稿してくださいすることができAPI呼び出しから戻る – Jonathan

+0

もちろん、この例はGetUserメソッドのコメント付きコードにもあります。{"data":{"id":12343281337970、 "name": "Eric Legault"、 "email": "eric @ foo "名前": "foo"}、{"id":123446170860、 "名前": "個人的なプロジェクト"}、{"id":1234250096894、 id ":12345000597911、" name ":" foo2 "}]}} –

答えて

1
    data
  1. はアレイではありません。あなたのサンプルでは、​​それは単一のオブジェクトです。
  2. AsanaObjectsクラスの逆シリアル化を行いたい場合は、1レベル下にdataクラスをデシリアライズする必要があります。
  3. 私はまた、ルートAsanaObjectsクラス

以下の作品に[DataContract]を投げなければならなかったし、完全なオブジェクトに戻ってくる:

using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Json; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string Json = @"{""data"":{""id"":12343281337970,""name"":""Eric Legault"",""email"":""[email protected]"",""photo"":null,""workspaces"":[{""id"":1234250096894,""name"":""foo""},{""id"":123446170860,""name"":""Personal Projects""},{""id"":12345000597911,""name"":""foo2""}]}}"; 
     static void Main(string[] args) 
     { 
      var theReturn = DeserializeJson(Json); 
     } 

     private static AsanaObjects DeserializeJson(string json) { 
      var jsonSerializer = new DataContractJsonSerializer(typeof(AsanaObjects)); 
      var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)); 

      return jsonSerializer.ReadObject(stream) as AsanaObjects; 
     } 

     public partial class AsanaObjects 
     { 
      [DataContract] 
      public class Workspace 
      { 
       [DataMember] 
       public object id { get; set; } 

       [DataMember] 
       public string name { get; set; } 
      } 
     } 

     public partial class AsanaObjects 
     { 
      [DataContract] 
      public class Data2 
      { 
       [DataMember] 
       public long id { get; set; } 

       [DataMember] 
       public string name { get; set; } 

       [DataMember] 
       public string email { get; set; } 

       [DataMember] 
       public object photo { get; set; } 

       [DataMember] 
       public Workspace[] workspaces { get; set; } 
      } 
     } 

     [DataContract] 
     public partial class AsanaObjects 
     { 
      [DataMember] 
      public Data2 data { get; set; } 
     } 
    } 
} 
+0

それは完璧です、ありがとう!これらの問題のトラブルシューティングを行うために、これらのシリアル化を視覚化するのに役立つツールがありますか? –

+0

他の人がより多くの洞察力を提供できるかもしれませんが、実際のデシリアライズは常に私にとってはブラックボックスのビットです。私はメモ帳++ jsonの視覚化、オンラインjsonバリデーター、過去の失敗の思い出の間を飛びます。 – Jonathan

+0

はい、間違いなく暗闇の中のショットです。いくつかのREST APIは、使いやすいJSONを返すか、間違ってマップされた変数型を特定できる有用なエラーを投げます。あなたはそれを推測しなければならない –

関連する問題