2012-03-23 6 views
1

WebアプリケーションからJSONを取得しました。私は、System.Web.Script.Serializationを使用して、この構文解析をObjectに試します。しかし、私は構文解析に問題があるPHP JSONをC#オブジェクトに変換する方法

const String jsonWeb = @"{ 
    ""error"" : 0, 
    ""result"" : { 
     ""data"" : { 
      ""1722278"" : { 
       ""din"" : ""741338;361490;648450;934096;180467;209928;805500;283840;901917;110193;9438;363965;700670;647965;18399;31993;714755;242839;60436;600310;"", 
       ""pid"" : ""11"" 
      }, 
      ""1752279"" : { 
       ""din"" : ""970510;771034;372305;286336;926373;459655;1409;140138;692017;311733;686476;368178;735954;635501;816346;821514;768444;510380;959990;916515;"", 
       ""pid"" : ""11"" 
      }, 
      ""1752280"" : { 
       ""din"" : ""992662;474351;139725;998728;475954;706331;798728;744204;999194;22546;177003;4098;448658;842154;431042;970297;989184;362126;7720;720781;"", 
       ""pid"" : ""11"" 
      } 
     }, 
     ""pid"" : { 
      ""11"" : { 
       ""codejs"" : "" very \""long\"" String  "", 
       ""max"" : ""3"" 
      } 
     }, 
     ""sys"" : { 
      ""11"" : { 
       ""1"" : { 
        ""b"" : ""Firefox"", 
        ""s"" : ""Windows"" 
       }, 
       ""2"" : { 
        ""b"" : ""Chrome"", 
        ""s"" : ""Windows"" 
       } 
      } 
     }, 
     ""maxgetlimit"" : 10001, 
     ""setProxy"" : [], 
     ""cidget"" : { 
      ""111102"" : 1 
     }, 
     ""openBrowser"" : 1 
    }}"; 

私はこのコードを使用してこれを解析しようとするとエラーが発生します。私はこれを使用してみてください:

public class Pack 
{ 
    public string din { get; set; } 
    public string pid { get; set; } 
} 

public class MySybObject 
{ 
    public Pack attributes { get; set; } 
} 

public class Result 
{ 
    public Result() { data = new List<MySybObject>(); } 
    public List<MySybObject> data { get; set; } 
} 

public class Code 
{ 
    public String codejs { get; set; } 
    public String max { get; set; } 
} 

public class MySubPid 
{ 
    public Code code { get; set; } 
} 

public class SystemReq 
{ 
    public String b { get; set; } 
    public String s { get; set; } 
} 

public class Sys 
{ 
    public SystemReq sysreq { get; set; } 
} 

public class Cidget 
{ 
    public String cidget { get; set; } 
} 

public class Response 
{ 
    public Response() {} 
    public string error { get; set; } 
    public Result results { get; set; } 
    public MySubPid pid { get; set; } 
    public Sys sys { get; set; } 
    public Int32 maxgetlimit { get; set; } 
    public String setProxy { get; set; } 
    public Cidget cidget { get; set; } 
    public String openBrowser { get; set; } 
} 

JavaScriptSerializer ser = new JavaScriptSerializer(); 
Response foo = ser.Deserialize<Response>(jsonWeb); 

をしかし、私はエラーを取得し、私はおそらく、データ内のオブジェクトの数を失った - これが私のために重要なデータです。

+1

エラーのあなたのテキストをお持ちですか? – asktomsk

+0

エラーとは何ですか? – Coder

+0

私はnullオブジェクトだけを取得します。 オブジェクト応答、結果はnullなど –

答えて

2

あなたのJSON文字列にkeysとして使用される番号があるので、代わりにクラスにデシリアライズのこのケースでは、動的オブジェクトを使用する方が良いでしょう(私はこれのためにJson.Netを使用)

dynamic jsonObj = JsonConvert.DeserializeObject(jsonWeb); 
Console.WriteLine(jsonObj.result.data["1722278"].pid); 
Console.WriteLine(jsonObj.result.sys["11"]["1"].b); 

ところで:この行は、この

のようなものでなければなりません

""codejs"" : "" very ""long"" String  "" 

間違っています3210

""codejs"" : "" very \""long\"" String  "", 

--EDIT--

foreach (var child in jsonObj.result.data.Children()) 
{ 
    Console.WriteLine(child.Name + "=> " + child.Value.din); 
} 
+0

すごいですが、私には1つの質問があります。 Console.WriteLine(jsonObj.result.data ["1722278"] .pid); しかし、私はデータの数を知らない - この数字はキーとしての使用ですが、値はランダムです。キーが利用可能な情報を取得することはできますか? –

+0

@BartoszKowalczyk私は答えを更新しました。 –

0

JSON class generatorを試して、クラスを生成してからもう一度試してみてください。

更新: JSON文字列を生成するためにそれを変更する必要がありました。

{ 
    "error" : 0, 
    "result" : { 
     "data" : { 
      "1722278" : { 
       "din" : "741338;361490;648450;934096;180467;209928;805500;283840;901917;110193;9438;363965;700670;647965;18399;31993;714755;242839;60436;600310;", 
       "pid" : "11" 
      }, 
      "1752279" : { 
       "din" : "970510;771034;372305;286336;926373;459655;1409;140138;692017;311733;686476;368178;735954;635501;816346;821514;768444;510380;959990;916515;", 
       "pid" : "11" 
      }, 
      "1752280" : { 
       "din" : "992662;474351;139725;998728;475954;706331;798728;744204;999194;22546;177003;4098;448658;842154;431042;970297;989184;362126;7720;720781;", 
       "pid" : "11" 
      } 
     }, 
     "pid" : { 
      "11" : { 
       "codejs" : "very long String  ", 
       "max" : "3" 
      } 
     }, 
     "sys" : { 
      "11" : { 
       "1" : { 
        "b" : "Firefox", 
        "s" : "Windows" 
       }, 
       "2" : { 
        "b" : "Chrome", 
        "s" : "Windows" 
       } 
      } 
     }, 
     "maxgetlimit" : 10001, 
     "setProxy" : [], 
     "cidget" : { 
      "111102" : 1 
     }, 
     "openBrowser" : 1 
    }} 
+0

しかし、これはデータとして1722278をクラスとして生成します。これは私にとっては悪いことです。 –

関連する問題