以下のように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; }
}
は、あなたが得る生のコンテンツ/ JSONを投稿してくださいすることができAPI呼び出しから戻る – Jonathan
もちろん、この例はGetUserメソッドのコメント付きコードにもあります。{"data":{"id":12343281337970、 "name": "Eric Legault"、 "email": "eric @ foo "名前": "foo"}、{"id":123446170860、 "名前": "個人的なプロジェクト"}、{"id":1234250096894、 id ":12345000597911、" name ":" foo2 "}]}} –