使用JSON.NET反序列化JSON



我已经用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。所以在最新的版本中你可能不需要这样做。

相关内容

  • 没有找到相关文章