Я использую ваш # 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; }
}
}
1011 *, который я десериализирую из , выглядит следующим образом:
{"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
.
EDIT
Хорошо, учитывая пример 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
}
А вот код C # для десериализации:
// 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));
Некоторые комментарии:
- Класс верхнего уровня для хранения результатов поиска называется GoogleSearchResults.
- Первое свойство в классе GoogleSearchResults -
kind
, соответствующее первому названному свойству в объекте json.У вас есть link
, который не будет работать, потому что link
не является именем свойства верхнего уровня в этом объекте json.В иерархии вашего json есть свойства, называемые «ссылками», но JavaScriptSerializer не вытащит эти вещи более низкого уровня на более высокий уровень. - Следующее свойство в моем классе GoogleSearchResults имеет тип SourceUrl.Это связано с тем, что свойство
url
в json - это не простая строка - это объект json с двумя свойствами, каждое из которых имеет строковое значение.Поэтому SourceUrl как класс в C # получает два строковых свойства, каждое из которых имеет соответствующее имя для десериализации одного из названных свойств. - следующее свойство в классе GoogleSearchResults называется «items», чтобы оно могло десериализовать словарь элементов из вашего json.Теперь items, как следует из названия, представляет собой массив в json, обозначенный квадратной скобкой вокруг его значения.Это означает, что может быть более одного элемента, хотя в вашем случае есть только один элемент.Так что это свойство в C # должно быть массивом (или коллекцией).Каждый элемент в результате json не является простой строкой, поэтому, как и в случае с SourceUrl, нам нужно определить класс-держатель для десериализации объекта:
GoogleSearchItem
.Этот класс имеет множество простых строковых свойств.Свойства в классе C # также могут иметь тип int или какой-либо другой тип, если этого требует json. - наконец, при распечатке результата, если вы просто вызовете
Console.WriteLine(result)
, вы увидите результат метода ToString()
, который неявно вызывается Console.WriteLine
.Это просто напечатает имя типа, в данном случае это «GoogleSearchResults», что, я думаю, не то, что вы хотите.Чтобы увидеть, что находится в объекте, вам нужно его сериализовать, как я показал.В результате этого вы увидите только значения вещей, которые вы десериализовали .Используя предоставленные мною классы, результат будет иметь меньше информации, чем исходный, потому что я не предоставил свойства в классе C #, соответствующие некоторым свойствам json, поэтому они не были десериализованы.