PragmaGames
@PragmaGames
Увлекаюсь Unity.

Как работать с Newtonsoft.JsonConvert.PopulateObject()?

Пытаюсь переопределить некоторые поля которые поступают с json. В данный момент при переопределении списка _levelParams он дополняется новыми объектами LevelParam с правильно заполненными полями. Мне нужно избавиться от создания нового объекта, а переопределить имеющиеся, так как внутри LevelParam есть Object link который мне нужно сохранить.

public class Main
{
    private LevelsConfig _config;
    
    public void OverrideConfig(string json)
    {
        JsonConvert.PopulateObject(json, _config);
    }
}
[Serializable]
public class LevelsConfig
{
    [JsonProperty("version")] private int _version;
    [JsonProperty("levelParams")] private List<LevelParam> _levelParams
}
[Serializable]
public class LevelParam
{
    [JsonIgnore] private Object _link; 
    
    [JsonProperty("steps")] private int _steps;
    [JsonProperty("complexity")] private int _complexity;
}
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
@hello_my_name_is_dany
Backend Developer (Node.js, PHP, C#)
К сожалению, PopulateObject в случае списка может только добавлять новые элементы. Можете попробовать реализовать свой Populate, в принципе для этого можно использовать JsonTextReader

Либо же откажитесь от Populate, сделайте DTO-класс с теми же полями, но nullable, и делайте маппинг руками.

Что-то типа такого:
[Serializable]
public class LevelsConfigDto
{
    [JsonProperty("version")] public int? Version { get; set; }
    [JsonProperty("levelParams")] public List<LevelParam>? LevelParams { get; set; }
}

public static void MepLevelsConfig(LevelsConfig target, LevelsConfigDto source)
{
    if (source.Version != null)
    {
        target.Version = source.Version;
    }

    if (source.LevelParam != null)
    {
        var count = Math.Min(target.LevelParam.Count, source.LevelParam.Count);

        for (int i = 0; i < count; i++)
        {
            target.LevelParam[i].Steps = source.LevelParam[i].Steps;
            target.LevelParam[i].Complexity = source.LevelParam[i].Complexity;
        }

        if (source.LevelParam.Count > target.LevelParam.Count)
        {
            for (int i = target.LevelParam.Count; i < source.LevelParam.Count; i++)
            {
                target.LevelParam.Add(source.LevelParam[i]);
            }
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы