Я пытаюсь проанализировать некоторые данные JSON из Google AJAX Search API. У меня есть этот URL, и я хотел бы разбить его так, чтобы результаты отображались. В настоящее время я написал этот код, но я довольно растерялся в отношении того, что делать дальше, хотя есть ряд примеров с упрощенными строками JSON.
Будучи новичком в C # и .NET в целом, я изо всех сил пытался получить подлинный текстовый вывод для моей страницы ASP.NET, поэтому мне рекомендовали попробовать JSON.NET. Может ли кто-нибудь указать мне правильное направление - просто написать код, который возьмет JSON из Google AJAX Search API и выведет его на экран?
РЕДАКТИРОВАТЬ: ВСЕ ИСПРАВЛЕНО! Все результаты работают нормально. Еще раз спасибо Dreas Grech!
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ServiceModel.Web;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
GoogleSearchResults g1 = new GoogleSearchResults();
const string json = @"{""responseData"": {""results"":[{""GsearchResultClass"":""GwebSearch"",""unescapedUrl"":""http://www.cheese.com/"",""url"":""http://www.cheese.com/"",""visibleUrl"":""www.cheese.com"",""cacheUrl"":""http://www.google.com/search?q\u003dcache:bkg1gwNt8u4J:www.cheese.com"",""title"":""\u003cb\u003eCHEESE\u003c/b\u003e.COM - All about \u003cb\u003echeese\u003c/b\u003e!."",""titleNoFormatting"":""CHEESE.COM - All about cheese!."",""content"":""\u003cb\u003eCheese\u003c/b\u003e - everything you want to know about it. Search \u003cb\u003echeese\u003c/b\u003e by name, by types of milk, by textures and by countries.""},{""GsearchResultClass"":""GwebSearch"",""unescapedUrl"":""http://en.wikipedia.org/wiki/Cheese"",""url"":""http://en.wikipedia.org/wiki/Cheese"",""visibleUrl"":""en.wikipedia.org"",""cacheUrl"":""http://www.google.com/search?q\u003dcache:n9icdgMlCXIJ:en.wikipedia.org"",""title"":""\u003cb\u003eCheese\u003c/b\u003e - Wikipedia, the free encyclopedia"",""titleNoFormatting"":""Cheese - Wikipedia, the free encyclopedia"",""content"":""\u003cb\u003eCheese\u003c/b\u003e is a food consisting of proteins and fat from milk, usually the milk of cows, buffalo, goats, or sheep. It is produced by coagulation of the milk \u003cb\u003e...\u003c/b\u003e""},{""GsearchResultClass"":""GwebSearch"",""unescapedUrl"":""http://www.ilovecheese.com/"",""url"":""http://www.ilovecheese.com/"",""visibleUrl"":""www.ilovecheese.com"",""cacheUrl"":""http://www.google.com/search?q\u003dcache:GBhRR8ytMhQJ:www.ilovecheese.com"",""title"":""I Love \u003cb\u003eCheese\u003c/b\u003e!, Homepage"",""titleNoFormatting"":""I Love Cheese!, Homepage"",""content"":""The American Dairy Association\u0026#39;s official site includes recipes and information on nutrition and storage of \u003cb\u003echeese\u003c/b\u003e.""},{""GsearchResultClass"":""GwebSearch"",""unescapedUrl"":""http://www.gnome.org/projects/cheese/"",""url"":""http://www.gnome.org/projects/cheese/"",""visibleUrl"":""www.gnome.org"",""cacheUrl"":""http://www.google.com/search?q\u003dcache:jvfWnVcSFeQJ:www.gnome.org"",""title"":""\u003cb\u003eCheese\u003c/b\u003e"",""titleNoFormatting"":""Cheese"",""content"":""\u003cb\u003eCheese\u003c/b\u003e uses your webcam to take photos and videos, applies fancy special effects and lets you share the fun with others. It was written as part of Google\u0026#39;s \u003cb\u003e...\u003c/b\u003e""}],""cursor"":{""pages"":[{""start"":""0"",""label"":1},{""start"":""4"",""label"":2},{""start"":""8"",""label"":3},{""start"":""12"",""label"":4},{""start"":""16"",""label"":5},{""start"":""20"",""label"":6},{""start"":""24"",""label"":7},{""start"":""28"",""label"":8}],""estimatedResultCount"":""14400000"",""currentPageIndex"":0,""moreResultsUrl"":""http://www.google.com/search?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den-GB\u0026q\u003dcheese""}}, ""responseDetails"": null, ""responseStatus"": 200}";
g1 = JSONHelper.Deserialise<GoogleSearchResults>(json);
Response.Write(g1.content);
}
}
public class JSONHelper
{
public static T Deserialise<T>(string json)
{
T obj = Activator.CreateInstance<T>();
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
DataContractJsonSerializer serialiser = new DataContractJsonSerializer(obj.GetType());
ms.Close();
return obj;
}
}
/// Deserialise from JSON
[Serializable]
public class GoogleSearchResults
{
public GoogleSearchResults() { }
public GoogleSearchResults(string _unescapedUrl, string _url, string _visibleUrl, string _cacheUrl, string _title, string _titleNoFormatting, string _content)
{
this.unescapedUrl = _unescapedUrl;
this.url = _url;
this.visibleUrl = _visibleUrl;
this.cacheUrl = _cacheUrl;
this.title = _title;
this.titleNoFormatting = _titleNoFormatting;
this.content = _content;
}
string _unescapedUrl;
string _url;
string _visibleUrl;
string _cacheUrl;
string _title;
string _titleNoFormatting;
string _content;
[DataMember]
public string unescapedUrl
{
get { return _unescapedUrl; }
set { _unescapedUrl = value; }
}
[DataMember]
public string url
{
get { return _url; }
set { _url = value; }
}
[DataMember]
public string visibleUrl
{
get { return _visibleUrl; }
set { _visibleUrl = value; }
}
[DataMember]
public string cacheUrl
{
get { return _cacheUrl; }
set { _cacheUrl = value; }
}
[DataMember]
public string title
{
get { return _title; }
set { _title = value; }
}
[DataMember]
public string titleNoFormatting
{
get { return _titleNoFormatting; }
set { _titleNoFormatting = value; }
}
[DataMember]
public string content
{
get { return _content; }
set { _content = value; }
}
}
Код в настоящее время компилируется и работает отлично, но не возвращает никаких результатов. Может ли кто-нибудь помочь мне вернуть то, что мне нужно, результаты готовы распечатать на экран?
Редактировать:
Json.NET работает с использованием того же JSON и классов, что и в примере выше.
GoogleSearchResults g1 = JsonConvert.DeserializeObject<GoogleSearchResults>(json);
Ссылка: Сериализация и десериализация JSON с Json.NET
Связанный
C # - анализ данных, отформатированных в json, во вложенные хеш-
таблицы.
GoogleSearchResults
тип имеет поля и свойства с одинаковыми именами. Попробуйте переименовать ваши поля с ведущими символами подчеркивания (что-то, что будет противоречить между ними).Ответы:
[Обновление]
Я только что понял, почему вы не получили результаты ... у вас пропущена строка в вашем
Deserialize
методе. Вы забыли присвоить результаты своемуobj
:Кроме того, просто для справки, вот
Serialize
метод:редактировать
Если вы хотите использовать Json.NET, вот методы Serialize / Deserialize, эквивалентные приведенному выше коду.
Deserialize:
Сериализация:
Это уже часть Json.NET, так что вы можете просто вызвать их в классе JsonConvert.
Ссылка: Сериализация и десериализация JSON с Json.NET
Теперь причина получения StackOverflow - ваша
Properties
.Возьмем, к примеру, этот:
Обратите внимание, что в
getter
, вы возвращаете фактическое свойство (т. Е. Получатель свойства вызывает себя снова и снова), и, таким образом, вы создаете бесконечную рекурсию.Свойства (в 2.0) должны быть определены так:
У вас есть личное поле, а затем вы возвращаете значение этого поля в геттере и устанавливаете значение этого поля в сеттере.
Кстати, если вы используете 3.5 Framework, вы можете просто сделать это и избежать полей поддержки, и позволить компилятору позаботиться об этом:
источник
DataContractJsonSerializer
он доступен только в рамках 3.5, нет?Ваш класс данных не соответствует объекту JSON. Используйте это вместо:
Кроме того, вам не нужно создавать экземпляр класса, чтобы получить его тип для десериализации:
источник
Я нашел этот подход, который разбирает JSON в динамический объект , он расширяет
DynamicObject
иJavascriptConverter
превращает строку в объект.DynamicJsonObject
конвертер
Использование ( образец JSON ):
Этот метод должен возвращать true, иначе он выдаст ошибку. Например, вы можете выдать ошибку, если ключ не существует.
Возврат
true
и опустошениеresult
вернет пустое значение, а не выдаст ошибку.источник
Я просто думаю, что весь пример будет полезен. Это пример этой проблемы.
источник
Я пытался использовать код выше, но не сработало. Структура JSON, возвращаемая Google, настолько отличается, и в вспомогательной функции есть очень важный недостаток: вызов
DataContractJsonSerializer.ReadObject()
который фактически десериализует данные JSON в объект.Вот код, который работает в 2011 году:
Чтобы получить содержимое первого результата, выполните:
источник
Спасибо за вашу помощь. Это моя последняя версия, и она работает благодаря вашей совместной помощи! Я только с указанием изменений , которые я сделал, все остальное берется из Джо Чунг работы
и
источник
Запрос Google API API и синтаксический анализ DirectionsResponse с C #, измените json в вашем URL на xml и используйте следующий код, чтобы превратить результат в пригодный для использования объект C # Generic List.
Мне понадобилось время, чтобы сделать. Но вот оно
Надеюсь, это кому-нибудь поможет.
источник