Десериализация JSON с помощью JSON.NET

#.net #linq #json #.net-3.5 #json.net

#.net #linq #json #.net-3.5 #json.net

Вопрос:

У меня уже есть ответ на этот вопрос, используя систему 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();
  

Я полагаю, что большая часть кода похожа / точно такая же, но я не уверен в аналоге containsKey в JSON.net . Я думаю, что это метод Contains(), но я не совсем уверен, как его использовать, чтобы я мог получить X и Y для SEARCHVAL .

Обновить:

итак, вот мой код для получения потока 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 ?

Ответ №1:

Взгляните на метод JObject.Parse в JSON.Net … http://james.newtonking.com/projects/json/help/SerializingJSONFragments.html

Тогда что-то вроде этого получит желаемые значения:

 JObject obj = JObject.Parse(yourstringjson);
string name = (string)obj["SearchResults"][0]["SEARCHVAL"]["X"];
  

Ответ №2:

Вместо того, чтобы разбирать строку вручную с помощью linq, я бы посоветовал вам использовать встроенный класс JsonSerializer.

В этом справочном блоге msdn предлагается использовать, если это.

Кроме того, ИМО было бы здорово использовать System.JSON, когда у нас нет строго типизированного класса. Но в вашем случае у вас есть класс, созданный для этого, поэтому использование встроенных функций более эффективно, а также лично я люблю использовать все, что встроено.

(отправка с мобильного устройства)

Комментарии:

1. Вы подключились к JavaScriptSerializer. Действительно, было бы неплохо использовать систему. 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 таким образом, вам, вероятно, не нужно будет делать это в самой обновленной версии.