2011-09-21 13 views
5

Tratando de deserializar este JSON:JavaScriptSerializer - cómo deserializar una propiedad con un guion ("-") en su nombre?

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

Mi clase:

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

supongo acumulativos-stats no consigue deserializado porque tiene cumulative_stats nombre de la variable en mi clase, cómo deserializar esa cosa con un guion?

+0

No hagas eso - más .NET las pautas de codificación lo tendrían como CumulativeStats. Si se trata de un miembro privado var entonces _cumulativeStats o m_cumulativeStats. – bryanmac

+0

@bryanmac: Creo que el formato JSON está completamente fuera de su control. – BalusC

+0

Creo que esto depende de las características de la biblioteca de serialización JSON que elija, pero en algunos hay atributos de C# que puede usar para definir una cadena del nombre asignado que es diferente del nombre de la clase C#. –

Respuesta

17

Una alternativa es utilizar el DataContractJsonSerializer en lugar del JavascriptSerializer.

Si declara sus clases como esto:

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

Usted puede deserializar así:

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

producirá: Cumulative-stats.downloadedBytes: 1111

+0

Gracias, esto funciona bien. :) Lástima que no puedo votar aún, se requieren algunas preguntas más nuevas. x) – Lars

+0

@Icarus ¿Puedo definir 'DataMember' solo para la propiedad que contiene el guión y dejar el resto tal como está? –

4

Creo que la mayoría de las bibliotecas de la serialización JSON apoyan alias de propiedades, como atributo personalizado:

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

Mi sugerencia es, a mantener su código C# con las convenciones estándar de codificación de C# y mapeo para el nombre de la propiedad en JSON.

+0

No estoy utilizando ninguna biblioteca externa, solo las incluidas en .NET framework, en este caso "using System.Web.Script.Serialization;" y luego: JavaScriptSerializer ser = new JavaScriptSerializer(); var des = ser.Deserialize (jsonString); Y .NET no tiene "JsonProperty". De todos modos, sin lib de terceros estoy jodido? Meh. – Lars

+2

JavaScriptSerializer utiliza [XmlElement ("json-name")] para asignar un nombre de differenet. –

+1

@JeffreyZhao Probé la sugerencia de XmlElement, pero esto no funciona. Tengo una propiedad json llamada uu que reasigné a SourceUrl pero SourceUrl termina nula. – KingOfHypocrites

Cuestiones relacionadas