1

JSON オブジェクトを自分のオブジェクトに逆シリアル化する際に問題が発生しています。特定のプロパティに対して null 許容値を取得しています。

問題: 完全なオブジェクトが null 可能

この場合、すべてのオブジェクト プロパティを null 値にしています。

JSON の例:

{
  "message": {
    "ts": "11/10/13 15:07:16",
    "content": "vivo-2482573605"
  }
}

リクエストを行い、逆シリアル化されたオブジェクトを返すコード:

        public T Request<T>(IEndPoint jsonObject)
        {
            string endPoint;
            string requestType;

            endPoint = jsonObject.ToURL();
            requestType = jsonObject.RequestType;
            string jsonData = jsonObject.Json;

            HttpWebRequest request = initRequest(URL + endPoint, requestType);

            if (!string.IsNullOrWhiteSpace(jsonData))
            {
                using (var writeStream = new StreamWriter(request.GetRequestStream()))
                {
                    writeStream.Write(jsonData);
                }
            }

            try
            {
                var httpResponse = (HttpWebResponse)request.GetResponse();

                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    string jsonResponse = streamReader.ReadToEnd();


                    if (!string.IsNullOrWhiteSpace(jsonResponse))
                    {
                        T value = Util.DeserializeJsonObject<T>(jsonResponse);
                        return value;
                    }

                    object ret = null;
                    return (T) ret;
                }
            }
            catch (WebException we)
            {
                object a = null;
                return (T) a;
            }
            catch (HttpResponseException hre)
            {
                object a = null;
                return (T)a;
            }
        }

デシリアライズ方法:

        public static T DeserializeJsonObject<T>(string json)
        {
            T deserizadedJson = new JavaScriptSerializer().Deserialize<T>(json);
            return deserizadedJson;
        }

編集:

すべてのプロパティが null のオブジェクトを取得しています。このプロパティには、JSON オブジェクトの値が設定されているはずです。

私のオブジェクト:

[DataContract]
class Message
{
    [DataMember]
    public string ts { get; set; }

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

}
4

2 に答える 2

0

答えを探しているときにこれに出くわした場合 (私が行ったように)、クラスにプライベート セッターがないかどうか、およびパラメーターなしのコンストラクターがないかどうかを確認する価値があります。

public string BusinessName { get; private set; }
public string Address1 { get; private set; }
public string Address2 { get; private set; }

私の場合、パラメーターなしのコンストラクターを持たず、すべてプライベート セッターを持つエンティティを含むドメイン レイヤーがあります。デシリアライザーは、MVC の自動バインドと同様に、パラメーターなしのコンストラクターとパブリック セッターを必要とします。

スタブ クラスを (ローカルに) 作成し、それをデシリアライズして、それを使用してエンティティ クラス コンストラクターへの呼び出しを作成しました。

public class LookedUpAddress
    {
        public string Address1 { get; set; }
        //...


// Deserialise...
List<LookedUpAddress> addressListStub = serializer.Deserialize<List<LookedUpAddress>>(result);


// Use it to create the entity
foreach (LookedUpAddress addr in addressListStub)
                {
                    addressList.Add(
                        new Address(
                        addr.AddressLine1,
                        //...
于 2015-10-27T09:47:37.150 に答える