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;
}
}
我认为您想要使用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();}退货内容;}