para obtener newtonsoft libreria informacion guardar crear con archivo abrir c# json windows-phone-8 webclient webclient-download

c# - obtener - Obteniendo cadena JSON desde la URL en Windows Phone 8



string json c# (3)

Así que estoy tratando de obtener una cadena Json de una URL en una aplicación Windows Phone 8. Solo tengo que llamar a un callbackurl que devuelve esta cadena, y eso es más o menos, pero de alguna manera me he quedado atrapado en esto por días y simplemente no entiendo cómo hacerlo

Tengo una clase urlparser que contiene 2 métodos que son:

public void ParseJsonUrl(string url) { Uri uri = new Uri(url); WebClient webClient = new WebClient(); webClient.DownloadStringCompleted += webClient_DownloadStringCompleted; webClient.DownloadStringAsync(uri); } void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { var jsonData = JsonConvert.DeserializeObject<parameter>(e.Result); Debug.WriteLine(jsonData.parameter1); }

Por ahora solo estoy tratando de mostrar uno de los parámetros contenidos en mi cadena Json, por supuesto, mis métodos realizarán otras cosas una vez que funcione

Tengo una clase llamada "parameters" al comienzo de mi archivo urlparser.cs que se parece a

public class parameter { public string parameter1 { get; set; } public string parameter2 { get; set; } public string parameter3 { get; set; } }

Pero esto no funciona ... obtengo este error

''System.Reflection.TargetInvocationException''

Seguí este tutorial http://blogs.msdn.com/b/pakistan/archive/2013/06/23/10425845.aspx y vi un montón de otros que son más o menos lo mismo, pero, por desgracia, esto no trabajo. En algunos tutoriales usan "DownloadString" en lugar de "DownloadStringAsync" pero no puedo llamar a este método (quizás no esté disponible con WP8), y en algunos otros tutoriales usan "esperar" en el método, pero no puedo entender dónde debe colocar la declaración "esperar" y qué otras piezas de código debo agregar

Además, una vez que pueda obtener mis datos json en mi var, si alguien me puede decir cómo acceder a ellos desde otra clase, ¡sería genial!

Gracias !


Asegúrese de que la estructura del archivo json recibida de WebClient sea similar a su estructura de clase analizada, es decir,

{
"parámetro": {
"parameter1": "somestring1",
"parameter2": "somestring2",
"parameter3": "somestring3"
}
}

De lo contrario, necesita crear una estructura de clase similar al formato de json que está recibiendo.

Alternativamente, puede crear un JObject desde json y acceder a los valores por clave (consulte aquí: http://james.newtonking.com/json/help/?topic=html/LINQtoJSON.htm )


Entonces, después de descubrir cuál era el problema, pensé que respondería la pregunta si alguien tiene el mismo problema algún día. El caso es que tenía un código en mi función "ParseJsonUrl" después de la línea

webClient.DownloadStringAsync(uri);

Y ese era el problema. Además, el ParseJsonUrl es llamado por una función llamada por un botón, y después de esa llamada, la función también realiza otras llamadas, y también el botón.

Y todas esas llamadas conducen al hecho de que la cadena nunca se descarga hasta que se realiza TODO lo que se llama con el botón, y yo necesitaba la cadena antes de eso.

La solución es crear el método DownloadStringCompleted en la clase que llama a mi función UrlParser.ParseJsonUrl, y pasar ese evento a la función en sus argumentos.

Luego, todo lo que debe realizarse con el clic del botón se establece en ese método DownloadStringCompleted

Cómo se ve en el código:

private void Button_Click(object sender, RoutedEventArgs e) { MyClass myClass = new MyClass(); myClass.Function(url); // Assuming url is already set somewhere }

Luego en MyClass

public string Function(string url) { this.url = url; URLParser parser = new URLParser(); parser.ParseJsonUrl(url, new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted )); } void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { //Everything you need to be performed once the string is downloaded }

Y finalmente en la clase UrlParser

public void ParseJsonUrl(string url, DownloadStringCompletedEventHandler handler) { Uri uri = new Uri(url); WebClient webClient = new WebClient(); webClient.DownloadStringCompleted += handler; webClient.DownloadStringAsync(uri); }

Espero que esto ayude a alguien algún día!


En primer lugar, debe ver cómo sería su clase de parámetro, puede hacerlo a través de aplicaciones "json to class" como aquí , donde inserta el enlace y la aplicación genera cómo debería ser la clase de parámetro, tenga en cuenta que a veces usted tiene que analizar el JSON manualmente, y también verifique su conexión a Internet.