2011-09-21 4 views
5

このJSONをデシリアライズしようとすると:JavaScriptSerializer - その名前にダッシュ( " - ")でプロパティを逆シリアル化する方法はありますか?

{ 
     "result":"success" 
     "arguments": { 
      "activeTorrentCount":22, 
      "cumulative-stats": { 
        "downloadedBytes":1111, 
      } 
     } 
    } 

私のクラス:それはその事をデシリアライズする方法を、私のクラスに変数名をcumulative_statsたため、

 private class DeserializationMain 
     { 
      public string result; //works 

      public args arguments; //works, has deserialized activeTorrentCount 
      public class args 
      { 
       public int activeTorrentCount; 

       public current cumulative_stats; //doesn't work, equals null 
       public class current 
       { 
        public long downloadedBytes; 
       } 
      } 
     } 

私は累積統計を推測がデシリアライズされません。ダッシュで?

+0

はそれをしない - ほとんどの.NETコーディングガイドラインでは、CumulativeStatsとしてそれを持っています。それがprivateメンバーvarの場合は、_cumulativeStatsまたはm_cumulativeStatsです。 – bryanmac

+0

@bryanmac:JSON形式は完全にコントロールできないと思います。 – BalusC

+0

これは、選択したJSONシリアライゼーションライブラリの機能に依存しますが、C#クラス名とは異なるマッピング名の文字列を定義するために使用できるC#属性もあります。 –

答えて

17

代わりに、JavascriptSerializerの代わりにDataContractJsonSerializerを使用することもできます。

あなたはこのようなあなたのクラス宣言する場合:

string json = "{\"result\":\"success\" , \"arguments\": { \"activeTorrentCount\":22, \"cumulative-stats\": { \"downloadedBytes\":1111  }  }  }"; 

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DeserializationMain)); 
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); 
DeserializationMain result = serializer.ReadObject(ms) as DeserializationMain; 

Console.WriteLine("Cumulative-stats.downloadedBytes: "+result.arguments.cumulative_stats.downloadedBytes); 

が生成されます:

 [DataContract] 
     private class DeserializationMain 
     { 
      [DataMember(Name = "result")] 
      public string result; //works 
      [DataMember(Name = "arguments")] 
      public args arguments; //works, has deserialized activeTorrentCount 
      [DataContract] 
      public class args 
      { 
       [DataMember(Name = "activeTorrentCount")] 
       public int activeTorrentCount; 

       [DataMember(Name = "cumulative-stats")] 
       public current cumulative_stats; //doesn't work, equals null 
       [DataContract] 
       public class current 
       { 
        [DataMember(Name = "downloadedBytes")] 
        public long downloadedBytes; 
       } 
      } 
     } 

をあなたはこのようにそれをデシリアライズすることができます Cumulative-stats.downloadedBytes: 1111

+0

ありがとう、これは正常に動作します。 :)あまりにも私はまだupvoteできない悪い、いくつかの初心者の質問が必要です。 x) – Lars

+0

@Icarusダッシュを含むプロパティに対してのみ 'DataMember'を定義し、残りはそのまま残すことができますか? –

4

私は、JSONのシリアライズライブラリのほとんどは、カスタム属性のように、プロパティの別名をサポートすると思う:

public class SomeClass { 
    [JsonProperty("cumulative-stats")] 
    public int CumulativeStats; 
} 

私の提案は、JSON内のプロパティ名に標準のC#のコーディング規則とマッピングを使用してC#コードを維持、です。

+0

私は外部のライブラリを使用していません。.NET Frameworkに含まれているものだけです。この場合は "using System.Web.Script.Serialization;"次に: JavaScriptSerializer ser = new JavaScriptSerializer(); var des = ser.Deserialize (jsonString); .NETには「JsonProperty」はありません。とにかく、サードパーティ製のライブラリなしで私はうんざりしていますか? Meh。 – Lars

+2

JavaScriptSerializer [XmlElement( "json-name")]を使用して差分名をマップします。 –

+1

@JeffreyZhao XmlElementの提案を試しましたが、これは機能しません。私は、私はSourceUrlに再マップするuuと呼ばれるjsonのプロパティがSourceUrl nullを終了します。 – KingOfHypocrites

関連する問題