我已经使用silverlight的System.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时出错的任何线索?
答案 0 :(得分:0)
看一下JSON.Net中的JObject.Parse方法...... http://james.newtonking.com/projects/json/help/SerializingJSONFragments.html
然后这样的东西会得到所需的值:
JObject obj = JObject.Parse(yourstringjson);
string name = (string)obj["SearchResults"][0]["SEARCHVAL"]["X"];
答案 1 :(得分:0)
我建议您使用内置的JsonSerializer类,而不是使用linq手动解析字符串。
此reference msdn blog建议使用它。
另外,IMO在我们没有强类型类时使用System.JSON会很棒。但是在你的情况下,你有一个为它制作的课程,所以使用内置功能更好,而且我个人喜欢使用内置的任何东西。
(从手机发布)
答案 2 :(得分:-2)
这是使用JSON.NET的工作解决方案:
获取json:
WebClient client = new WebClient();
using (StreamReader reader = new StreamReader(client.OpenRead(uri)))
{
json = reader.ReadToEnd();
}
将流解析为JObject:
JObject searchResult = JObject.Parse(json);
string lat = searchResult["SearchResults"][1]["X"].ToString().Replace("\"","");
string lon = searchResult["SearchResults"][1]["Y"].ToString().Replace("\"","");
如果解析后的字符串中不包含不必要的字符,则可以忽略.Replace()。我使用的是Json.NET 3.5,因此您可能不需要在最新版本中执行此操作。