JSON сериализация с использованием рекурсии и отражения. (Проблема с массивами) - PullRequest
1 голос
/ 25 февраля 2020

В настоящее время я пытаюсь создать свой собственный метод сериализации JSON, но у меня возникает проблема с массивами, когда я вызываю свой метод "сериализации", который вызывается так:

string person = MyJsonConverter.Serialize(new Clerk("Alexander", 1999, new List<string> { "Computer Science", "Web Developer" }));
Console.WriteLine(person);

, который производит следующее:

{"Skills": ["Capacity": "4", "Count": "2"], "Name": "Alexander", "YearOfBirth": "1999"}

Но должно произойти это:

{"Skills": ["Computer Science", "Web Developer"], "Name": "Alexander", "YearOfBirth": "1999"}

Вопрос, с которым мне нужна помощь, заключается в следующем, я не совсем уверен, что я делаю неправильно, но по какой-то причине он принимает свойства массива, а не значения массива.

public static string Serialize(object obj)
{
    StringBuilder stringBuilder = new StringBuilder();

    IEnumerable<PropertyInfo> properties = obj.GetType().GetProperties().Where(p => p.GetIndexParameters().Length == 0);

    if (typeof(IEnumerable).IsAssignableFrom(obj.GetType()))
        stringBuilder.Append($"[");
    else
        stringBuilder.Append($"{{");

    foreach (var property in properties)
        if (property.PropertyType.IsPrimitive || property.PropertyType == typeof(string))
            stringBuilder.Append($"\"{property.Name}\": \"{property.GetValue(obj)}\", ");
        else
            stringBuilder.Append($"\"{property.Name}\": {Serialize(property.GetValue(obj))}, ");

    string temp = stringBuilder.ToString().Trim().Remove(stringBuilder.ToString().Length - 2);

    stringBuilder.Clear();
    stringBuilder.Append(temp);

    if (typeof(IEnumerable).IsAssignableFrom(obj.GetType()))
        stringBuilder.Append($"]");
    else
        stringBuilder.Append($"}}");

    return stringBuilder.ToString();
}

Вся помощь очень приветствуется.

1 Ответ

0 голосов
/ 25 февраля 2020

Я решил это следующим образом:

public static string Serialize(object obj)
{
    StringBuilder stringBuilder = new StringBuilder();

    IEnumerable<PropertyInfo> properties = obj.GetType().GetProperties();

    if (!obj.GetType().IsPrimitive && obj.GetType() != typeof(string))
    {
        bool isArray = typeof(IEnumerable).IsAssignableFrom(obj.GetType()) ? true : false;

        if (isArray)
            stringBuilder.Append($"[");
        else
            stringBuilder.Append($"{{");

        if (!isArray)
            foreach (var property in properties)
                if (property.PropertyType.IsPrimitive || property.PropertyType == typeof(string))
                    stringBuilder.Append($"\"{property.Name}\": \"{property.GetValue(obj)}\", ");
                else
                    stringBuilder.Append($"\"{property.Name}\": {Serialize(property.GetValue(obj))}, ");
        else
            foreach (var i in obj as IEnumerable)
                if (i.GetType().IsPrimitive || i.GetType() == typeof(string))
                    stringBuilder.Append($"\"{i}\", ");
                else
                    stringBuilder.Append($"{Serialize(i)}, ");

        stringBuilder.Remove(stringBuilder.ToString().Length - 2, 2);

        if (isArray)
            stringBuilder.Append($"]");
        else
            stringBuilder.Append($"}}");
    }
    else
        stringBuilder.Append(obj.ToString());

    return stringBuilder.ToString();
}

Это может быть не самым красивым, но это работает.

Я все еще открыт для предложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...