0

このコードに基づいて、.NET 3.5 Winforms アプリから呼び出される Web API メソッドから受信した json を逆シリアル化しようとしています: http://msdn.microsoft.com/en-us/library/bb412179(v=vs.90 .aspx

json が返されますが、デシリアライズ時にルートを取得できず、うなり声が上がります。

ここに画像の説明を入力

問題のクライアント コードは次のとおりです。

try
{
    var client = new RestClient();
    client.BaseUrl = "http://localhost:48614/"; // <-- this works
    var request = new RestRequest();
    request.Resource = "api/departments/"; // can replace this with other data, such as redemptions, etc.
    RestResponse response = client.Execute(request) as RestResponse;
    if ((response.StatusCode == HttpStatusCode.OK) && (response.ResponseStatus == ResponseStatus.Completed)) // Both are probably not necessary
    {
        MessageBox.Show(string.Format("Content is {0}", response.Content));
        // from http://msdn.microsoft.com/en-us/library/bb412179(v=vs.90).aspx
        MemoryStream deptStream = new MemoryStream();
        DataContractJsonSerializer cereal = new DataContractJsonSerializer(typeof(Department));
        deptStream.Position = 0;
        Department dept = (Department)cereal.ReadObject(deptStream);
        MessageBox.Show(string.Format("accountId is {0}, deptName is {1}", dept.AccountId, dept.DeptName));
    }
    else
    {
        MessageBox.Show(string.Format("Status code is {0} ({1}); response status is {2}",
            response.StatusCode, response.StatusDescription, response.ResponseStatus));
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

response.Content 行は正常に機能しており、ダイアログに json データが表示されています。

Department データは、.NET 4 ASP.NET / Web API アプリで次のように定義されます。

namespace DuckbilledPlatypusServerWebAPI.Models
{
    public class Department
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string AccountId { get; set; }
        [Required] 
        public string DeptName { get; set; }
    }
}

...そして、データを受け取る .NET 3.5 Winforms アプリで次のようにします。

[DataContract]
public class Department
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string AccountId { get; set; }
    [DataMember] 
    public string DeptName { get; set; }
}

それで、それが機能するためにまだ何が必要ですか?要求が厳しいように見えるので、「ルート」要素をどのように提供すればよいですか?

アップデート

Badriの答えはエラーメッセージを解決しますが、DataContractJsonSerializerで動作するデータをまだ取得していないか、間違ってアクセスしています。ここに私のコードがあります:

MessageBox.Show(string.Format("Content is {0}", response.Content));
byte[] bytes = Encoding.UTF8.GetBytes(response.Content);
MemoryStream deptStream = new MemoryStream(bytes);
deptStream.Position = 0;
DataContractJsonSerializer jasonCereal = new DataContractJsonSerializer(typeof(Department));
Department dept = (Department)jasonCereal.ReadObject(deptStream);
MessageBox.Show(string.Format("accountId is {0}, deptName is {1}", dept.AccountId, dept.DeptName));

...そして、最初のメッセージ ボックスには jsonarray が表示されますが、

ここに画像の説明を入力

...2 つ目は、accountId と deptName が空の文字列であることを示しています。DataContractJsonSerializer をどのように不正処理していますか?

4

1 に答える 1

1

deptStreamMemoryStreamは新しくなりましたが、逆シリアル化の前に、に返された JSON 応答をどこにロードしますか。あなたはこのようなことをすべきです。

byte[] bytes = Encoding.UTF8.GetBytes(response.Content);
MemoryStream deptStream = new MemoryStream(bytes);
deptStream.Position = 0;

// Deserialize now

UPDATE あなたのJSONDepartmentは、単一のオブジェクトではなく、オブジェクトのリストに対応していDepartmentます。このようなことを試してください。

var jasonCereal = new DataContractJsonSerializer(typeof(List<Department>));
var depts = (List<Department>)jasonCereal.ReadObject(deptStream);
foreach(var dept in depts)
    MessageBox.Show(
         String.Format("accountId is {0}, deptName is {1}",
                                        dept.AccountId, dept.DeptName));
于 2013-10-15T01:28:56.513 に答える