2011-06-01 16 views
5

digamos que tengo la siguiente carga de JSON;Clases de JSON a C#: nombres de propiedades desconocidas

{ 
    "pagemap": { 
    "metatags": [ 
    { 
     "msapplication-task": "name\u003dAbout Tugberk Ugurlu;action-uri\u003d/about;icon-uri\u003d/content/App_Icons/icos/about.ico", 
     "msapplication-task": "name\u003dContact;action-uri\u003d/contact;icon-uri\u003d/content/App_Icons/icos/contact.ico", 
     "msapplication-task": "name\u003dBlog RSS Feed;action-uri\u003dhttp://feeds.feedburner.com/TugberkUgurlu;icon-uri\u003d/content/App_Icons/icos/rss.ico", 
     "msapplication-task": "name\u003dTugberk on Twitter;action-uri\u003dhttp://twitter.com/tourismgeek;icon-uri\u003d/content/App_Icons/icos/twitter.ico", 
     "msapplication-starturl": "./", 
     "application-name": "Tugberk's Blog", 
     "msapplication-tooltip": "bla bla bla..." 
    } 
    ] 
    } 
    } 

Los nombres de propiedad bajo mettags son dinámicos. Me refiero a uno de ellos es msapplication-starturl para esta solicitud, pero podría ser msapplication-foo para otro.

¿Cuáles serían las mejores clases de C# para este tipo de carga útil JSON?

EDITAR

Ésta es la parte del formato JSON qué API de Google Search da. También estoy usando Json.NET. ¿Hay alguna otra manera que no sea dinámica?

+0

La única forma algo escrito algo-que puede ser * estáticamente representado * representado es 'IDictionary ' (como un elemento de secuencia de 'metatags') o similar - por supuesto, si esta naturaleza dinámica solo se aplica a "msapplication-" ... pero ¿por qué hacerlo aún más confuso? :) Honestamente, no estoy muy seguro de lo que se está preguntando de otra manera: -/ –

+0

@pst esta es la parte del formato JSON que proporciona la API de búsqueda de Google. También estoy usando Json.NET. No hay otra manera que dinámica, ¿verdad? – tugberk

+0

@pst Creo que la pregunta es bastante clara. También es muy fácil entender que las metatags contienen los metetags de la página. por lo que será muy posible que sean diferentes. – tugberk

Respuesta

2

yo probablemente sólo quieren la matriz MetaTags para obtener sólo empujado a un Dictionary<string,string> o incluso sólo List<string> y luego escribir una clase de ayuda que analiza msapplication-task valores en algo que desea.

Editar: Creo que el PO está buscando un poco de ayuda en la forma de su clase del modelo en realidad sería

public class PageMap 
{ 
    public Dictionary<string,string> MetaTags {get;set; } 
} 

De mirando ese objeto JSON, parece que RestSharp debe ser capaz de deserializar en esta clase.

Código de llamada sería similar a

var client = new RestClient("somegoogle.com"); 
var request = new RestRequest("Some/Foo/Bar", Method.GET) 
           { RequestFormat = DataFormat.Json }; 
request.AddParameter("p1", "quigybo"); 
client.Execute<PageMan>(request) 
+0

bien, ¿cómo puedo deserializar eso en una clase? – tugberk

+0

@tugberk - Diccionario * es * una clase. – Greg

+0

@Greg por lo que sería esto: 'public Dictionary Metatags {get; conjunto; } '? – tugberk

2

Usted debe mirar JSON.NE T y JObject para la construcción de objetos dinámicos sin apretar mecanografiadas. Si decide usarlo, debe descargarlo al NuGet.

Ejemplo:

var client = new WebClient(); 
client.Headers.Add("User-Agent", "your user agent here"); 
var response = client.DownloadString(new Uri("http://www.domain.com/source-page.html")); 
JObject jo = JObject.Parse(response); 
+0

+1 para mencionar JObects directos, RestSharp es biult en la parte superior de JSON.NET por lo que OP lo tiene implícitamente. –

+0

Nunca había escuchado de JObject. Cheers mate, respuesta muy útil :-) –

Cuestiones relacionadas