2016-10-06 23 views
0

我想反序列化我從Asana API中的用戶/我調用中獲取的數據,如下所示,但對象正在返回null jsonResponse var。數據在那裏 - 如果我將其作爲純文本閱讀,我可以看到它。我也嘗試使用[JsonProperty(「id」)]屬性而不是[DataMember]用於JsonSerializer而不是DataContractJsonSerializer,但我得到一個異常:「無法投射類型爲'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] 公共類工作空間 { [DataMember] public object 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 .com「,」photo「:null,」workspaces「:[{」id「:1234250096894,」name「:」foo「},{」id「:123446170860,」name「:」Personal Projects「},{」 id「:12345000597911,」name「:」foo2「}]}} –

回答

1
  1. data不是數組。在你的示例中,它是一個單一的對象。
  2. 您想要在根類AsanaObjects類中進行反序列化,而不是在data類中的一個級別下。
  3. 我也只好扔在根[DataContract]AsanaObjects

下工作,並與完整的對象回來:

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,或者至少引發有助於查明錯誤映射變量類型的有用錯誤。有些你只能猜測它似乎 –