Downloading JSON in UWP (C#) Downloading JSON in UWP (C#) json json

Downloading JSON in UWP (C#)


I've had a look at your code.

FIRSTLY

Where you've got:

/* private void textBlock_SelectionChanged(object sender, RoutedEventArgs e)     {         PhoneCallManager.ShowPhoneCallUI("0213132131", "my name");     }*/} // <-- This brace is closing off the class too early.

The last brace is closing off the class, and therefore the FetchAsync(url) method is trying to be declared as its own class.

Remove the offending } from after this code, and place one right at the bottom. Like this:

            /* private void textBlock_SelectionChanged(object sender, RoutedEventArgs e)         {             PhoneCallManager.ShowPhoneCallUI("0213132131", "my name");         }*/        public async Task<string> FetchAsync(string url)        {            string jsonString;            using (var httpClient = new System.Net.Http.HttpClient())            {                var stream = await httpClient.GetStreamAsync(url);                StreamReader reader = new StreamReader(stream);                jsonString = reader.ReadToEnd();            }            return jsonString;        }    } } // <-- Add this one, right here

This is causing your

Error CS0116 A namespace cannot directly contain members such as fields or methods

Error CS0103 The name 'FetchAsync' does not exist in the current context Murakami

AndSECONDLY

Your await FetchAsync(url); call is inside the constructor of the class, which cannot be marked as async.

You need to create a new method, wrapping your

var json = await FetchAsync(url);            using (FileStream fs = new FileStream("cache1.txt", FileMode.Create))            {                json.Save(fs);            }            Debug.WriteLine(json);

In its own async method, and then call that from your constructor instead.

Like this:

    private async void NewMethod(string url)    {        var json = await FetchAsync(url);        using (FileStream fs = new FileStream("cache1.txt", FileMode.Create))        {            // Do stuff in here to write to your file...        }        Debug.WriteLine(json);    }

Visit https://msdn.microsoft.com/en-us/windows/uwp/files/quickstart-reading-and-writing-files to find out more on writing text to a file in UWP.

And call it from your ctor...

public MainPage() {        string url = "http://papajohn.pp.ua/?mkapi=getProductsByCat&cat_id=82";        NewMethod(url); // Now call your newly-created method.        ... // Do your other stuff as before.}

This was what was causing your

Error CS4033 The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

Hope this helps! Let me know if you need anything more.


Lets start from the beginning:

Error CS0116 A namespace cannot directly contain members such as fields or methods

You have miss somewhere { or } signs (or they are in wrong place. If you check your code once again for correct braces then first and second errors will disappear.

What's about

The 'await' operator can only be used within an async method...

You should have "async" predicate in method where "await" operation called. But as I remember you can't make coustructor async. So, I can recommend you place your code in Loading event and add async predicate to this event


You may use GetAsync

 var response = await client.GetAsync(url);                if (response.IsSuccessStatusCode)                {                    return await response.Content.ReadAsAsync<string>();                }

Header namespace:

using System.Net.Http;using System.Net.Http.Headers;

and read response in json string instead of StreamReader.