2011-09-21 86 views
5

尝试反序列化JSON这样:JavaScriptSerializer - 如何在名称中使用破折号(“ - ”)反序列化属性?

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

我的类:

 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; 
       } 
      } 
     } 

我猜累积统计数据不被反序列化,因为它在我的课,如何反序列化的东西有cumulative_stats变量名用短划线?

+0

不这样做的 - 大多数.NET编码指南将它作为CumulativeStats。如果它是私人成员var,则为_cumulativeStats或m_cumulativeStats。 – bryanmac

+0

@bryanmac:我认为JSON格式完全超出了他的控制范围。 – BalusC

+0

我相信这取决于您选择的JSON序列化库的功能,但是在一些C#属性中,您可以使用它来定义与C#类名称不同的映射名称的字符串。 –

回答

17

一种替代方法是使用DataContractJsonSerializer而不是JavascriptSerializer。

如果你宣布你的类是这样的:

 [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; 
       } 
      } 
     } 

你可以反序列化这样的:

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); 

会产生: Cumulative-stats.downloadedBytes: 1111

+0

谢谢,这工作正常。 :)太糟糕了,我不能upvote,但需要一些更多的新手问题。 x) – Lars

+0

@Icarus我可以只为包含破折号的属性定义'DataMember',并保持原样? –

4

我想大多数的JSON序列化图书馆的支持别名特性,比如自定义属性:

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

我的建议是,保持与标准的C#编码规范和映射到JSON属性名的C#代码。

+0

我没有使用任何外部库,只包含在.NET框架中的库,在这种情况下“使用System.Web.Script.Serialization;”然后: JavaScriptSerializer ser = new JavaScriptSerializer(); var des = ser.Deserialize (jsonString); 而.NET没有“JsonProperty”。反正,没有第三方lib我拧了?咩。 – Lars

+2

JavaScriptSerializer使用[XmlElement(“json-name”)]来映射不同的名称。 –

+1

@JeffreyZhao我尝试了XmlElement建议,但这不起作用。我有一个名为uu的json属性,我将其重新映射到SourceUrl,但SourceUrl结束为空。 – KingOfHypocrites

相关问题