Как сериализовать в объекты JSON, вложенные в другие объекты?

#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() ).