C#JObject.Parse()怎么能等到它完全得到json字符串

本文关键字:json 字符串 C#JObject 怎么能 Parse | 更新日期: 2023-09-27 17:57:52

我只创建了一个简单的JsonDataManager,以JSON格式进行编写,并对其进行解析,以便稍后使用。然而,JObject.Parse不会等到Web客户端获得JSON数据,并直接使用"将由JSON填充"字符串。我怎样才能推送它,直到它完全得到JSON字符串?

public class JsonDataManager{
         String myData = "its going to be filled by json";

        public JsonDataManager(string Category)
        {
            String url = "<a href="http://www.kaanbarisbayrak.com/?json=get_category_posts&cat="+Category;<br">http://www.kaanbarisbayrak.com/?json=get_category_posts&cat="+Catego...</a> />
            WebClient wc = new WebClient();
            wc.Encoding = System.Text.Encoding.UTF8;
            wc.Headers["Accept"] = "application/json";
            wc.DownloadStringAsync(new Uri(url), UriKind.Relative);
            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
        }

        public String getWriting()
        {
            JObject obj = JObject.Parse(myData);
            JArray array = (JArray)obj["posts"];
            string writing = (string)array[0]["content"]; 
            return writing;
        }

        private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            myData = e.Result;
        }

    }

C#JObject.Parse()怎么能等到它完全得到json字符串

我认为您想要使用Task<string>。这意味着getWriting()是一个最终将返回字符串但不会阻塞线程的函数。要做到这一点,只需将下载调用封装在一个任务中即可。然后,您可以附加一个ContinueWith函数作为回调函数,该函数接收结果并将其打印到屏幕上。

class JsonDataManager
{
    String url = "http://www.kaanbarisbayrak.com/?json=get_category_posts&cat=";
    string data = "";
    HttpClient hc;
    public JsonDataManager(string Category)
    {
        hc = new HttpClient();
        url += Category;
    }
    public Task<string> getWriting()
    {
        return Task.Factory.StartNew<string>(() =>
        {
            data = hc.GetStringAsync(url).Result;
            // use the resulting string
            JObject obj = JObject.Parse(data);
            JArray array = (JArray)obj["posts"];
            string writing = (string)array[0]["content"];
            return writing;
        });
    }
}

    private void Form1_Load(object sender, EventArgs e)
    {
        JsonDataManager manager = new JsonDataManager("4");
        manager.getWriting().ContinueWith((task) =>
        {
            string writing = task.Result;
            MessageBox.Show(writing);
        });
    }

您需要等待WebClient完成下载。一种方法是使用手动重置事件:

public class JsonDataManager
{
   String myData = "its going to be filled by json";
   ManualResetEvent mre = new ManualResetEvent(false);
   public JsonDataManager(string Category)
   {
       String url = "<a href="http://www.kaanbarisbayrak.com/?json=get_category_posts&cat="+Category;<br">http://www.kaanbarisbayrak.com/?json=get_category_posts&cat="+Catego...</a> />
       WebClient wc = new WebClient();
       wc.Encoding = System.Text.Encoding.UTF8;
       wc.Headers["Accept"] = "application/json";
       wc.DownloadStringAsync(new Uri(url), UriKind.Relative);
       wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
   }
   public String getWriting()
   {
       mre.WaitOne();
       JObject obj = JObject.Parse(myData);
       JArray array = (JArray)obj["posts"];
       string writing = (string)array[0]["content"]; 
       return writing;
   }
   private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
   {
       myData = e.Result;
       mre.Set();
   }
}

在此处阅读有关重置事件的更多信息。

public class JsonDataManager
{
    readonly String _url;
    public JsonDataManager(string category)
    {
        _url = @"http://www.kaanbarisbayrak.com/?json=get_category_posts&cat="+category;
    }
    public async Task<String> getWriting()
    {
        WebClient wc = new WebClient();
        wc.Encoding = System.Text.Encoding.UTF8;
        wc.Headers["Accept"] = "application/json";
        JObject obj = JObject.Parse(await wc.DownloadStringTaskAsnync(_url));
        JArray array = (JArray)obj["posts"];
        string writing = (string)array[0]["content"]; 
        return writing;
    }
}

使用它:

var jsonManager = new JsonDataManager("whatever");
var writing = await jsonManager.getWriting();

这段代码没有经过测试,但我希望你能明白。

如果您试图发布数据并获取json结果,我建议您使用StreamReader来正确获取响应。请参阅下面的方法,它将以字符串的形式返回结果,您可以将其解析为json。

公共字符串GetJsonResult(字符串url,字符串queryStringValues){//创建web请求HttpWebRequest HttpWebRequest;httpWebRequest=(httpWebRequest)WebRequest.Create(url+queryStringValues);httpWebRequest.Method="POST";httpWebRequest.Timeout=6000;httpWebRequest.ContentType="application/json";System.Net.ServicePointManager.Expect100Continue=false;//提出请求并得到回应HttpWebResponse响应=null;response=(HttpWebResponse)httpWebRequest.GetResponse();string content=";使用(var stream=new StreamReader(response.GetResponseStream()){content=流。ReadToEnd();}退货内容;}