Ответ 1
Я использую ваш подход # 2: десериализуем JavaScriptSerializer.
Это то, что я делаю, чтобы десериализовать ответ от Facebook:
// get the id for the uploaded photo
var jss = new JavaScriptSerializer();
var resource = jss.Deserialize<Facebook.Data.Resource>(responseText);
.... где Facebook.Data.Resource определяется следующим образом:
namespace Facebook.Data
{
public class Resource
{
public string id { get; set; }
}
}
responseText
, который я десериализую, выглядит следующим образом:
{"id":"10150111918987952",
"from":{"name":"Someone",
"id":"782272221"},
"name":"uploaded from Cropper. (at 12\/15\/2010 7:06:41 AM)",
"picture":"http:\/\/photos-f.ak.fbcdn.net\/hphotos-ak-snc4\/hs817.snc4\/69790_101501113333332_782377951_7551951_8193638_s.jpg",
...
Но поскольку у меня есть только одно свойство, определенное в классе Resource
, я только десериализую это. Определите поля в своем классе, которые вы хотите десериализовать.
Он работает, чтобы использовать наследование, конечно. Вы можете определить свои классы данных следующим образом:
namespace Facebook.Data
{
public class Resource
{
public string id { get; set; }
}
public class Person : Resource
{
public string name { get; set; }
}
}
... и затем вы можете десериализовать объект Person
.
ИЗМЕНИТЬ
Хорошо, учитывая пример json, который вы указали в обновленном вопросе, вот как я написал классы для хранения ответа:
public class GoogleSearchItem
{
public string kind { get; set; }
public string title { get; set; }
public string link { get; set; }
public string displayLink { get; set; }
// and so on... add more properties here if you want
// to deserialize them
}
public class SourceUrl
{
public string type { get; set; }
public string template { get; set; }
}
public class GoogleSearchResults
{
public string kind { get; set; }
public SourceUrl url { get; set; }
public GoogleSearchItem[] items { get; set; }
// and so on... add more properties here if you want to
// deserialize them
}
И здесь код С# для десериализации:
// create a new instance of JavaScriptSerializer
JavaScriptSerializer s1 = new JavaScriptSerializer();
// deserialise the received response
GoogleSearchResults results = s1.Deserialize<GoogleSearchResults>(json);
Console.WriteLine(s1.Serialize(results));
Некоторые комментарии:
- Класс toplevel для сохранения результата поиска называется GoogleSearchResults.
- Первое свойство класса GoogleSearchResults -
kind
, соответствующее первому именованному свойству в объекте json. У вас былlink
, который не будет работать, потому чтоlink
не является именем свойства верхнего уровня в этом объекте json. Есть свойства ниже в иерархии вашего json с именем "link", но JavaScriptSerializer не вытащит эти вещи более низкого уровня на более высокий уровень. - Следующее свойство в моем классе GoogleSearchResults имеет тип SourceUrl. Это связано с тем, что свойство
url
в json не является простой строкой - это json-объект с двумя свойствами, каждый со строковым значением. Таким образом, SourceUrl как класс в С# получает два свойства строки, каждый из которых имеет соответствующее имя для десериализации одного из этих именованных свойств. - следующее свойство в классе GoogleSearchResults называется "items", так что оно может десериализовать словарь предметов из вашего json. Теперь элементы, как следует из названия, представляют собой массив в json, который обозначается квадратной скобкой вокруг его значения. Это означает, что может быть более одного элемента, хотя в вашем случае есть только один элемент. Таким образом, это свойство в С# должно быть массивом (или набором). Каждый элемент в json-результате не является простой строкой, поэтому, как и в случае с SourceUrl, нам нужно определить класс-держатель для десериализации объекта элемента:
GoogleSearchItem
. Этот класс имеет кучу простых строковых свойств. Свойства класса С# также могут иметь тип int или какой-либо другой тип, если это требует json. - наконец, при распечатке результата, если вы просто вызываете
Console.WriteLine(result)
, вы увидите результат методаToString()
, который неявно вызываетсяConsole.WriteLine
. Это просто напечатает имя типа, в данном случае это "GoogleSearchResults", который, как мне кажется, не является тем, что вы хотите. Чтобы увидеть, что в объекте, вам нужно сериализовать его, как я показал. В результате этого вы увидите только значения тех вещей, которые вы десериализировали. Используя предоставленные мной классы, результат будет иметь меньше информации, чем оригинал, потому что я не предоставил свойства в классе С#, соответствующем некоторым свойствам json, поэтому они не были десериализованы.