时间:2011-11-02 15:43:14

标签: .net linq json .net-3.5 json.net

我已经使用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时出错的任何线索?

3 个答案:

答案 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,因此您可能不需要在最新版本中执行此操作。