0

逆シリアル化する必要がある非常に単純な DataContract クラスがあります。私は特定の理由で JSON.NET を使用していないので、DataContractJsonSerializer を使用します。

私の契約クラスは次のようになります

[DataContract(Name = "d")]
    public class ResponseClass
    {
        [DataMember]
        public int ResponseCode
        { get; set;}
        [DataMember]
        public string ResponseMessage
        { get; set;}
        [DataMember]
        public string Response
        { get; set;}
    }

サービス呼び出しは有効な Json 文字列で返されますが、逆シリアル化では、渡される値が非 0 または非 string.Empty であるにもかかわらず、最後の値は常に 0 または string.Empty です。

私のデシリアライズコードは次のようになります

    private string deserializeJSON(string resp, bool code = false)
    {
        string value = string.Empty;
        ResponseClass deserialized = null;
        using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(resp)))
        {
            stream.Position = 0;
            var ser = new DataContractJsonSerializer(typeof(ResponseClass));
            deserialized = ser.ReadObject(stream) as ResponseClass;
        }
        value = code ? deserialized.Response : deserialized.ResponseCode.ToString();
        return value;
    }

私はこれに関する答えを探しましたが、何も戻ってきません。

データ バックは次のようになります (これがコントラクト バックが「d」と呼ばれる理由です。違いがあるかどうかはわかりませんが、結果は同じです。RespCode は 0、RespMess、Resp = string.Empty です)。

{ 
    "d":
    {
         "RespCode": 0,
         "RespMess": null,
         "Resp": null
    }
}
4

1 に答える 1

1

C# クラス プロパティ (例: ResponseCode) と JSON 名 (例: RespCode) が一致しないためNameDataMember属性でそれらを指定する必要があります。また、 を含む構造はdResponseClassContainer単にDataContract d. これは機能します:

private string deserializeJSON(string resp, bool code = false)
{
    string value = string.Empty;
    ResponseClass deserialized = null;
    using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(resp)))
    {
        stream.Position = 0;
        var ser = new DataContractJsonSerializer(typeof(ResponseClassContainer));
        deserialized = (ser.ReadObject(stream) as ResponseClassContainer).d;
    }
    value = code ? deserialized.Response : deserialized.ResponseCode.ToString();
    return value;
}
[DataContract]
public class ResponseClassContainer
{
    [DataMember]
    public ResponseClass d { get; set; }
}
[DataContract]
public class ResponseClass
{
    [DataMember(Name="RespCode")]
    public int ResponseCode
    { get; set;}
    [DataMember(Name="RespMess")]
    public string ResponseMessage
    { get; set;}
    [DataMember(Name="Resp")]
    public string Response
    { get; set;}
}

0整数と文字列が存在しているのnullは、これらがそれぞれの型のデフォルト値であるためです。文字列には認識されたデータがなかったので、そこに設定されたのはこれらだけでした。

于 2013-11-04T17:06:49.437 に答える