#c# #json #json.net
#c# #json #json.net
Вопрос:
У меня есть два объекта, причем первый имеет экземпляр второго в качестве свойства.
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public PhoneNumber PhoneNumber { get; set; }
}
public class PhoneNumber
{
public int DialingCode { get; set; }
public int AreaCode { get; set; }
public int FirstThree { get; set; }
public int LastFour { get; set; }
}
Моя цель состоит в том, чтобы, используя Newtonsoft.Json, сериализуй мой Person
класс в строку JSON, где PhoneNumber
свойство также сериализуется, вот так:
"Person": {
"FirstName": "String",
"LastName": "String",
"Age": "Int",
"PhoneNumber": {
"DialingCode": "Int",
"AreaCode": "Int",
"FirstThree": "Int",
"LastFour": "Int"
}
}
но я сталкиваюсь с проблемой, когда JsonConverter, который я использую, только сериализует Person
объект, а вместо PhoneNumber
свойства просто отображает имя объекта, вот так:
"Person": {
"FirstName": "String",
"LastName": "String",
"Age": "Int",
"PhoneNumber": "PhoneNumber"
}
И ниже приведен код для моего пользовательского JsonSerializer:
public class CustomJsonConverter : JsonConverter
{
private readonly Type[] _types;
public CustomJsonConverter(params Type[] types)
{
_types = types;
}
public override bool CanConvert(Type objectType)
{
return _types.Any(t => t == objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
serializer.Serialize(writer, null);
return;
}
var properties = value.GetType().GetProperties();
writer.WriteStartObject();
foreach (var property in properties)
{
writer.WritePropertyName(property.Name);
var propertyName = property.PropertyType.Name == "Int32" ? "Int" : property.PropertyType.Name;
serializer.Serialize(writer, propertyName);
}
writer.WriteEndObject();
}
}
Есть ли какой-либо способ, которым я мог бы сериализовать объект и все объекты, которые содержатся в нем?
Комментарии:
1. Зачем вы вообще используете пользовательский конвертер?
2. Пользовательский конвертер используется для отображения типа данных каждого из свойств в JSON (т.е.
"FirstName": "String"
).3. Хорошо, я вижу это — но это не сериализация.
"FirstName": "Ziggy"
выводится ли сериализатором значение свойства, а не тип4. @Delfino но вам это не нужно! Он также может обрабатывать преобразование пользовательских свойств.
5. @DavideVitali Я не совсем уверен, о чем вы говорите.
Ответ №1:
На самом деле вы можете просто сериализовать это одним вызовом
var json = JsonConvert.SerializeObject(person);
и это все.
Комментарии:
1. Я обнаружил, что в конструкторе моего
Person
объекта я не создавал экземплярPhoneNumber
свойства (т.Е.PhoneNumber = new PhoneNumber()
).