JsonConvert.Deserialize追加到默认属性值。如何防止这种情况?

问题描述 投票:1回答:3

我有一个.json配置文件,在其中存储应用启动时反序列化的应用设置。

示例:

{
    "MyProperty1": "MyValue1",
    "MyProperty2": [1, 2, 3]
}

JSON反序列化到的对象是:

public class Config{
    public string MyProperty1{ get; set; }
    public List<int> MyProperty2{ get; set; } = new List<int> { 4, 5, 6 };
}

我遇到的问题是,当属性MyProperty2的JSON被反序列化时,它将值1,2,3附加到默认属性值4,5,6,结果是MyProperty2 = 4, 5,6,1,2,3

我希望MyProperty2默认为4、5、6,除非在.json配置文件中另外指定。任何帮助,将不胜感激,谢谢。

c# json serialization properties default-value
3个回答
0
投票

尝试解决Config类中的所有问题:

public class Config
{
    public Config()
    {
        this.MyProperty2 = new List<int> { 4, 5, 6 };
    }
    public string MyProperty1 { get; set; }
    public List<int> MyProperty2 {
        get {
            return this.MyProperty2;
        } 
        set {
            if(this.MyProperty2.Count > 0)
            {
                this.MyProperty2.Clear();
                this.MyProperty2 = value;
            }
        } 
    }
}

0
投票

这通常对我有用:您可能会认为,如果发出“获取”请求,它将设置默认值。如果在“获取”之前完成“设置”,则仅当“值”为null时,属性才会获取默认值。

public class Config{
    public string MyProperty1{ get; set; }

    private List<int> myProperty2{ get; set; } ;
    public List<int> MyProperty2{ 
        get{
            if (myProperty2 == null)
                myProperty2 = new List<int> { 4, 5, 6 };

            return  myProperty2 ;
        } 
        set{
            myProperty2 = value;
        } 
    } 
}

0
投票

您可以使用JsonConvert中的Newtonsoft.Json

var setting = "{\"MyProperty1\": \"MyValue1\", \"MyProperty2\": [1, 2, 3]}";
var settingConfig = JsonConvert.DeserializeObject(setting);

和配置类

public class Config
{
    public string MyProperty1 { get; set; }
    [Newtonsoft.Json.JsonConverter(typeof(DefaultArrayConverter))]
    public List<int> MyProperty2 { get; set; } = new List<int> { 4, 5, 6 };
}

这里我写了一个客户JsonConverter。

public class DefaultArrayConverter : JsonConverter
{

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var value = serializer.Deserialize(reader, objectType);
        return value;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override bool CanConvert(Type objectType)
    {
        return false;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

它工作正常,但是我不确定为什么MyProperty2在您的实现中有6个值。

© www.soinside.com 2019 - 2024. All rights reserved.