#.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 таким образом, вам, вероятно, не нужно будет делать это в самой обновленной версии.