【问题标题】:Deserializing JSON using JSON.NET使用 JSON.NET 反序列化 JSON
【发布时间】:2011-11-02 15:43:13
【问题描述】:

我已经使用 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();

我认为大部分代码都相似/完全相同,但我不确定 ContainsKey 在 JSON.net 中的对应部分。我认为它是 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 时哪里出错了?

【问题讨论】:

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


    【解决方案1】:

    看看 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"];
    

    【讨论】:

      【解决方案2】:

      建议您使用内置的JsonSerializer 类,而不是使用 linq 手动解析字符串。

      这个reference msdn blog 建议使用 if it。

      此外,IMO 在我们没有强类型类时使用 System.JSON 会很棒。但在你的情况下,你有一个为它制作的类,所以使用内置函数会更好,而且我个人喜欢使用内置的任何东西。

      (从手机发帖)

      【讨论】:

      • 您链接到 JavaScriptSerializer。事实上,如果 System.JSON 不限于 Silverlight,使用它会很好。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多