2011-09-21 12 views
5

il tentativo di deserializzare questo JSON:JavaScriptSerializer - come deserializzare una proprietà con un trattino ("-") nel suo nome?

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

La mia classe:

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

Credo cumulativi-stats non ottiene deserializzati perché ha cumulative_stats nome di variabile nella mia classe, come deserializzare quella cosa con un trattino?

+0

non farlo - più .net le linee guida per la codifica lo avrebbero come CumulativeStats. Se è un membro privato var quindi _cumulativeStats o m_cumulativeStats. – bryanmac

+0

@bryanmac: Penso che il formato JSON sia completamente fuori dal suo controllo. – BalusC

+0

Credo che ciò dipenda dalle caratteristiche della libreria di serializzazione JSON scelta, ma in alcuni ci sono attributi C# che è possibile utilizzare per definire una stringa del nome mappato diverso dal nome della classe C#. –

risposta

17

Un'alternativa è utilizzare DataContractJsonSerializer invece di JavascriptSerializer.

Se si dichiara vostre classi in questo modo:

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

È possibile deserializzare in questo modo:

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

produrrà: Cumulative-stats.downloadedBytes: 1111

+0

Grazie, funziona bene. :) Peccato che non riesca ancora a parlare, sono necessarie alcune altre domande per principianti. x) – Lars

+0

@Icarus Posso definire 'DataMember' solo per la proprietà contenente il trattino e lasciare il resto così com'è? –

4

penso la maggior parte delle librerie di serializzazione JSON supportano alias per le proprietà, come attributo personalizzato:

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

Il mio suggerimento è, a mantenere il vostro codice C# con le convenzioni di codifica C# standard e la mappatura per il nome della proprietà in JSON.

+0

Non sto usando nessuna libreria esterna, solo quelle incluse nel framework .NET, in questo caso "using System.Web.Script.Serialization;" e quindi: JavaScriptSerializer ser = new JavaScriptSerializer(); var des = ser.Deserialize (jsonString); E .NET non ha "JsonProperty". In ogni caso, senza la lib di terze parti sono fregato? Meh. – Lars

+2

JavaScriptSerializer usa [XmlElement ("json-name")] per mappare un nome diverso. –

+1

@JeffreyZhao Ho provato il suggerimento XmlElement, ma questo non funziona. Ho una proprietà json chiamata uu che rimappare a SourceUrl ma SourceUrl finisce nullo. – KingOfHypocrites

Problemi correlati