簡體   English   中英

Json正確反序列化密鑰但不值

[英]Json deserializing key correctly but not value

我正在嘗試將JSON字符串反序列化為對象。 以下是網絡接口名稱的類別和IP地址映射的列表:

[DataContract]
public class NicMappings
{
    public NicMappings()
    {
        this.Ips = new List<IPAddress>();
    }

    [DataMember]
    public string NetworkInterfaceName { get; set; }

    [DataMember]
    public List<IPAddress> Ips { get; }
}

還有另一個類Settings,它包含NicMappings列表:

[DataContract]
public class Settings
{
    public Settings()
    {
        this.PrivateIps = new List<IPAddress>();
        this.VirtualIps = new List<IPAddress>();
        this.IpRanges = new List<IPPrefix>();
        this.NicMappings = new List<NicMappings>();
    }

    [DataMember]
    public List<IPAddress> PrivateIps { get; private set; }

    [DataMember]
    public List<IPAddress> VirtualIps { get; private set; }

    [DataMember]
    public List<IPPrefix> IpRanges { get; private set; }

    [DataMember]
    public List<NicMappings> NicMappingsList { get; private set; }
}

為了進行測試,我正在讀取單個NicMapping,其中包含一個名稱和一個可以序列化的IP(以及Settings類的其他成員)。 這是輸出json:

{"PrivateIps":["10.0.0.1","10.0.0.2","10.0.0.3"],..."NicMappings":[{"NetworkInterfaceName":"Nic","Ips":["127.0.0.1"]}]}

反序列化是問題所在。 除NicMappings之外,其他所有設置都可以反序列化。 它可以反序列化名稱,但不會反序列化Ips。 它甚至不會引發異常。 我在語句中添加了一條日志以檢查Ips的計數,它顯示0。這是我用來反序列化的代碼:

Settings settings = Serializer.GetSettings<Settings>(file);

序列化器是一個類,具有JsonSerializerSettings對象,該對象具有活頁夾和一些定義的轉換器。

public T GetSettings(string file)
{
    string json = File.ReadAllText(file);
    return Deserialize<T>(json);
}

下一個,

List<NicData> nicData = GetNicData(settings.NicMappingsList);

private List<NicData> GetNicData(List<NicMappings> NicMappingsList)
{
    List<NicData> NicDatas = new List<NicData>();
    foreach (NicMappings nicMapping in NicMappingsList)
    {
        NicData nicData = new NicData
        {
            NetworkInterfaceName = nicMapping.NetworkInterfaceName
        };

        foreach (IPAddress ipAddress in nicMapping.Ips)
        {
            nicData.Ips.Add(ipAddress.ToString());
        }

        nicDataList.Add(NicData);
    }

    return nicDataList;
}

上面的代碼為我返回了一個列表,其中包含一個具有正確名稱的單個元素,但包含一個空的Ips列表。

順便說一句,NicData與NicMappings幾乎相同

public class NicData
{
    public NicData()
    {
        Ips = new List<string>();
    }

    public string NetworkInterfaceName { get; set; }

    public List<string> Ips { get; }
}

我不確定要看哪里。 知道應該檢查代碼的哪一部分嗎? 如果問題仍未解決,或者您需要更多信息,請告訴我。 謝謝!

嘗試添加二傳手:

public List<string> Ips { get; set;}

有關序列化的更多信息,請點擊此處

它說:

不要在具有Data-MemberAttribute的所有屬性上實現getter和setter。 數據協定序列化程序要求將類型的getter和setter都視為可序列化的。 如果將不以部分信任的方式使用該類型,則屬性訪問器中的一個或兩個可以是非公共的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM