Стоит рассмотреть тот JSON, который вы хотите.
Если у вас есть этот класс
class Person
{
public string Name { get; set; }
public PhoneNumber HomePhone { get; set; }
}
Вы хотите, чтобы это сериализовалось в JSON, вот так
{ "Name":"Joe", "HomePhone": "555-555-555" }
Но вы получаете JSON, что-то вроде этого
{ "Name":"Joe","HomePhone": {"Number": "555-555-555"} }
-
Чтобы понять, почему это так, учтите, что свойство Число из Персона является объектом . JSON ожидает, что по крайней мере {} обернет объект - или более точно, набор имен / значений в {}.
Если вы действительно хотите использовать прежний синтаксис JSON, вам нужно зарегистрировать пользовательский преобразователь для объекта Person , чтобы можно было убедить его сериализовать и десериализовать в виде строки. (см. пример кода ниже).
Однако я бы порекомендовал вам просто принять, что, поскольку PhoneNumber является объектом, он соответствует словарю имя / значение при сериализации в JSON, и принимаете, что JSON будет выглядеть немного менее «чистым», чем в идеале хочу.
FWIW вот пример кода, который достигает вашей первоначальной цели (не рекомендуемый подход) ..
class Person
{
public string Name { get; set; }
public PhoneNumber HomeNumber { get; set; }
}
struct PhoneNumber
{
private string _number;
public PhoneNumber(string number)
{
_number = number;
}
public override string ToString()
{
return _number;
}
}
class PersonConverter : JavaScriptConverter
{
public override IEnumerable<Type> SupportedTypes
{
get { yield return typeof(Person); }
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
Person person = obj as Person;
if (person != null)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict["Name"] = person.Name;
dict["HomeNumber"] = person.HomeNumber.ToString();
return dict;
}
return new Dictionary<string, object>();
}
public override object Deserialize(IDictionary<string, object> dict, Type type, JavaScriptSerializer serializer)
{
if (dict == null)
throw new ArgumentNullException("dict");
if (type == typeof(Person))
{
// Deserialize the Person's single property.
string name = (string)dict["Name"];
string homeNumber = (string)dict["HomeNumber"];
// Create the instance to deserialize into.
Person person = new Person()
{
Name = name,
HomeNumber = new PhoneNumber(homeNumber)
};
return person;
}
return null;
}
}
class Program
{
static void Main(string[] args)
{
PhoneNumber number = new PhoneNumber("555 555");
Person joe = new Person() { Name = "Joe", HomeNumber = number };
JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new JavaScriptConverter[] { new PersonConverter() });
Console.Out.WriteLine(serializer.Serialize(joe));
}
}