2016-05-18 10 views
0

私はこのJSONを持っており、C#のオブジェクトに逆シリアル化したいと考えています。データフィールドは辞書のように見えます。このJSONをC#オブジェクトに逆シリアル化できません

{ 
    "responseID": "LTg5MjUyNDgxMDgyNzU3NjgyNDMtMjAxNi0wNS0xOFQxOTo1ODoxOS45ODFaLTk4MTAwMDAwMA==", 
    "timestamp": "2016-05-18T19:58:19.981Z", 
    "type": "v0.1-reject-reason-codes", 
    "context": { 
    "tenant": "hpho" 
    }, 
    "data": { 
    "LOST_TO_COMPETITOR": "Lost to Competitor", 
    "OTHER": "Other (see notes)", 
    "DISCONTINUED": "Product Discontinued", 
    "SERVICE_ISSUES": "Service Issues", 
    "SEASONAL": "Seasonal Fluctuations" 
    } 
} 

これは、クラス定義

public static class JSONConstants 
    { 
     public const string responseID = "responseID"; 
     public const string timestamp = "timestamp"; 
     public const string type = "type"; 
     public const string context = "context"; 
     public const string data = "data"; 
     public const string tenant = "tenant"; 
    } 

    [DataContract] 
    public class RejectReasonCodesResponse 
    { 
     [DataMember(Name = JSONConstants.responseID)] 
     public string ResponseID { get; set; } 
     [DataMember(Name = JSONConstants.timestamp)] 
     public string Timestamp { get; set; } 
     [DataMember(Name = JSONConstants.type)] 
     public string Type { get; set; } 
     [DataMember(Name = JSONConstants.context)] 
     public SummaryContext Context { get; set; } 
     [DataMember(Name = JSONConstants.data)] 
     public Dictionary<string, string> Data { get; set; } 
    } 

    [DataContract] 
    public class SummaryContext 
    { 
     [DataMember(Name = JSONConstants.tenant)] 
     public string Tenant { get; set; } 
    } 

ですこれはしかし、objResponseのデータフィールドが空である私はそれをデシリアライズする方法

string requestURL = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 

       HttpWebRequest request = WebRequest.Create(requestURL) as HttpWebRequest; 
       request.Headers["Ocp-Apim-Subscription-Key"] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 

       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

       if (response.StatusCode != HttpStatusCode.OK 
       && response.StatusCode != HttpStatusCode.NonAuthoritativeInformation) 
        throw new Exception(String.Format(
         "Server error (HTTP {0}: {1}).", 
         response.StatusCode, 
         response.StatusDescription)); 

       DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(RejectReasonCodesResponse)); 
       object objResponse = jsonSerializer.ReadObject(response.GetResponseStream()); 

です。私は何を間違えたのですか?

答えて

0

クラスの定義を確認できますか?私はそれがこのように見えるべきだと思う。

public class SummaryContext 
{ 
    public string tenant { get; set; } 
} 

public class Data 
{ 
    public string LOST_TO_COMPETITOR { get; set; } 
    public string OTHER { get; set; } 
    public string DISCONTINUED { get; set; } 
    public string SERVICE_ISSUES { get; set; } 
    public string SEASONAL { get; set; } 
} 

public class RejectReasonCodesResponse 
{ 
    public string responseID { get; set; } 
    public string timestamp { get; set; } 
    public string type { get; set; } 
    public Context context { get; set; } 
    public Data data { get; set; } 
} 
+0

異なるテナントには異なるデータセットがあります。したがって、これらのキーは固定ストリングではありません。 – user3305040

0

むしろまずjson.lintのようなサイトを使用してJSONをlintのjavascriptserializer

よう
javascriptserializer js = new javascriptserializer(); 
var response = js.Deserialize<RejectReasonCodesResponse>(jsonstring); 
0

を使用してみてください。あなたのグリーンがビジュアルスタジオに入って特別なペーストをしたら、jsonをクラスとして貼り付けることができます。ウェブサイトJson2csharpも便利です。

+0

わかりませんが、別のJsonライブラリを使用すると、データモデルにヒントがなくてもいいかもしれません。 Json.netとサービススタックは2 iveです。 – brumScouse

関連する問題