Десериализация JSON с использованием JSON.NET - PullRequest
1 голос
/ 02 ноября 2011

У меня уже есть ответ на этот вопрос с помощью System.JSON Silverlight, но спецификации изменились, и теперь мне нужно сделать это в .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 ПОИСКА.

ОБНОВЛЕНИЕ:

так вот мой код для получения потока 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 голосов
/ 02 ноября 2011

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

Это ссылка на блог MSDN предлагает использование, если оно.

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

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

0 голосов
/ 03 ноября 2011

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

0 голосов
/ 02 ноября 2011

Взгляните на метод 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"];
...