我已经用silverlight的系统得到了答案。JSON,但是规范改变了,现在我需要在。net 3.5中做
这是我得到的JSON
{"SearchResults":[{"PageCount":"1"},
{"SEARCHVAL":"Result","CATEGORY":"Category1","X":"1","Y":"2"},
{"SEARCHVAL":"AnotherResult","CATEGORY":"Category1","X":"2","Y":"2"}]}
和使用System的解决方案。JSON程序集
var resultList = ((JsonArray)searchResults["SearchResults"])
.OfType<JsonObject>()
.Where(o => o.ContainsKey("SEARCHVAL"))
.Select(o => new SearchResult() {
SearchValue = o["SEARCHVALUE"],
Category = o["CATEGORY"].
X = o["X"],
Y = o["Y"]
}).ToList();
我认为大多数代码是相似的/完全相同的,但我不确定在JSON.net的ContainsKey的对应。我认为这是Contains()方法,但我不确定如何使用它,这样我就可以得到SEARCHVAL的X和Y。
更新:
这是我获取JSON流和解析的代码: ...
Uri uri = new Uri(url);
WebClient client = new WebClient();
ParseJSON(client.OpenRead(uri));
}
private void ParseJSON(Stream stream)
{
if (stream == null)
return;
StreamReader reader = new StreamReader(stream);
JObject searchResult = JObject.Parse(reader.ReadLine());
string x= searchResult["SearchResults"][0]["SEARCHVAL"]["X"].ToString();
string y= searchResult["SearchResults"][0]["SEARCHVAL"]["Y"].ToString();
// use data
...
,我在string lat = searchresult...
上得到一个空异常。知道我在使用json。net时哪里出错了吗?
看一下jobobject。JSON.Net中的解析方法…http://james.newtonking.com/projects/json/help/SerializingJSONFragments.html
那么像这样的东西将得到所需的值:
JObject obj = JObject.Parse(yourstringjson);
string name = (string)obj["SearchResults"][0]["SEARCHVAL"]["X"];
我建议您使用内置的JsonSerializer类,而不是使用linq手动解析字符串。
这个参考msdn博客建议使用它。
另外,在我看来,使用System会很棒。JSON时我们没有强类型类。但在你的情况下,你有一个类,所以使用内置的函数是更好的,我个人也喜欢使用任何内置的。
(手机发送)
下面是使用JSON的工作解决方案。净:
获取json:
WebClient client = new WebClient();
using (StreamReader reader = new StreamReader(client.OpenRead(uri)))
{
json = reader.ReadToEnd();
}
将流解析为jobobject:
JObject searchResult = JObject.Parse(json);
string lat = searchResult["SearchResults"][1]["X"].ToString().Replace(""","");
string lon = searchResult["SearchResults"][1]["Y"].ToString().Replace(""","");
如果解析的字符串中不包含不必要的字符,则可以忽略. replace()。我用的是Json。所以在最新的版本中你可能不需要这样做。