2012-06-26 19 views
13

Estoy tratando de hacer una sola clase de datos que contenga información de Facebook y Twitter.Asigna múltiples propiedades Json?

pero en mi respuesta JSON de twitter necesito id_str y de FaceBook obtengo id.

Necesito esos dos para ponerlos en el id -string.

Ahora sé que puedo usar [JsonProperty("id_str")] si quiero deserializar Twitters id_str en mi id -string.

Pero, ¿qué sucede si necesito que id de Facebook y Twitters id_str se deserialicen en el mismo id -cadena que tengo en mi clase de datos?

Respuesta

7

No, esto no es posible.

Echemos un vistazo a Json.NET documentation. En particular, la página de ayuda sobre la clase JsonPropertyAttribute.

Para citar:

"Instruye al JsonSerializer para siempre serializar el miembro con el nombre especificado."

Está declarado en el espacio de nombres Newtonsoft.Json. Necesitamos determinar cómo se declara. Vamos a echar un vistazo a código fuente del Json.NET en CodePlex:

http://json.codeplex.com/

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property |  
AttributeTargets.Parameter, AllowMultiple = false)] 
public sealed class JsonPropertyAttribute : Attribute 
{ 
    //... 
} 

Guess que responde a la pregunta. La propiedad AllowMultiple del atributo se establece en falsa. Por lo tanto, no puede decorar una propiedad, campo o parámetro más de una vez con este atributo.

Incluso si pudieras ¿cómo esperas que Json.net descubra qué atributo usar? Crearía tipos para Twitter y Facebook por separado en los que puede deserializar los datos JSON recibidos.

Así:

Twitter -> JSON -> Twitter specific types 
Facebook -> JSON -> Facebook spefic types 

A continuación, cree una abstracción que utiliza su aplicación en lugar de hacer frente a este tipo directamente. Simplemente pertenecen a una implementación específica de redes sociales.

Twitter/Facebook/... tipos speficic -> Sus tipos

Si intenta deserializar directamente a los datos en sus "tipos comunes", a continuación, sólo se va a seguir luchando porque no se alinean 100% con los datos recibidos y terminará con una lógica de deserialización funky y difícil de mantener.

Otra opción es crear su propio convertidor Json.NET personalizado.

http://geekswithblogs.net/DavidHoerster/archive/2011/07/26/json.net-custom-convertersndasha-quick-tour.aspx

Basta con crear un convertidor para Twitter y Facebook y al deserializar los datos JSON, basta con especificar qué convertidor que desea utilizar.

  • TwitterConverter
  • FacebookConverter

ej .:

MySocialType myType = JsonConvert.DeserializeObject<Mapped>(json, 
    new TwitterConverter()); 

De todos modos me gustaría tratar de evitar la contaminación de los tipos de clase con la lógica de deserialización en sí.

+0

Bueno, yo estaba esperando que simplemente verificaría cualquiera de ellos y usaría el que no es nulo. Creo que tendré que pensar en otra cosa ... ¡Gracias de todos modos! :) –

+0

Creo que la última opción debería funcionar bastante bien. – JefClaes

9

Creo que he resuelto de la manera más sencilla posible .....

public string id_str { 
     get{return id;} 
     set{id = id_str;} 
    } 

    public string id { get; set; } 

Simplemente añade tanto e hizo el uno, configure el otro .. Funciona: P soluciones simples a veces son la mejor ?

+2

Funcionará, pero tipos de contaminantes a su tipo con todo tipo de propiedades. La mitad de los cuales nunca se usan según el JSON que deserializaste. –

+0

de hecho, pero al menos me permitirá probar mi teoría antes de hacerlo de la manera correcta :) –

+0

Bingo !!!!! para algunos casos simples esta es la mejor solución –

1

Si está buscando un modelo de clase genérico para consumir, puede hacerlo de la siguiente manera.

public class GenericClass 
{ 
    public virtual string ID {get;set;} 
} 
public class FaceBook : GenericClass 
{ 
    [JsonProperty("id")] 
    public override string ID { get => base.ID; set => base.ID = value; } 
} 
public class Twitter : GenericClass 
{ 
    [JsonProperty("id_str")] 
    public override string ID { get => base.ID; set => base.ID = value; } 
} 

Para Facebook,

GenericClass genericClass = JsonConvert.DeserializeObject<FaceBook>(json); 

Fot Twitter,

GenericClass genericClass = JsonConvert.DeserializeObject<Twitter>(json); 

y se puede olvidar lo que clase de modelo se utiliza, y sólo tiene que utilizar GenericClass

Cuestiones relacionadas