Десериализация объекта, связанного с объектами словаря, используя JsonConvert C # - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь сериализовать объект, определенный ниже.Это происходит правильно, используя Newtonsoft JsonConvert.Это возвращает строку.Когда я пытаюсь десериализовать строку обратно в определенный объект, она не работает и выдает исключение

private class PlotSetFeatureStateInfo
{                    
    public IDictionary<int,IDictionary<AxisTypeAndUnitInfo,ManualScaleInfo>> PersistentScaleInfo
    {
        get;
        set;
    }


    public IDictionary<Guid,ScaleType> PlotIdVsLocalScaleType { get; set; }            
    public IDictionary<Guid,IDictionary<AxisTypeAndUnitInfo, 
           PlotScales.PersistentScaleData>> PlotIdVsPersistentScaleData { get; set;}
}



 var foo = new FeatureStateInfo
                {
                     //Fill values
                };
 var res = JsonConvert.SerializeObject(foo);
 var deserializedProperty = JsonConvert.DeserializeObject<FeatureStateInfo>(res);//Throws error

Получение приведенной ниже ошибки

Невозможно десериализовать текущий массив JSON (например,[1,2,3]) в тип 'System.Collections.Generic.IDictionary 2[System.Int32,System.Collections.Generic.IDictionary 2 [Axis, ManualScale]]', поскольку тип требует десериализации объекта JSON (например, {"name": "value"})правильно.Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {"name": "value"}), либо измените десериализованный тип на массив или тип, который реализует интерфейс коллекции (например, ICollection, IList), например List, который можетбыть десериализованным из массива JSON.Атрибут JsonArrayAttribute также можно добавить к типу, чтобы принудительно десериализовать его из массива JSON

Публикация образца JSON без каких-либо изменений.Это действительный json.

{"PersistentScaleInfo":[{"Key":1,"Value":[{"Key":{"AxisType":0,"UnitInfo":{"UnitId":"601988e7-06a1-4dfd-9bba-535989b3afba","SubunitId":"00000000-0000-0000-0000-000000000000"}},"Value":{"Units":"Hz ","MaxScale":400,"MinScale":0.062,"IsAuto":false,"Axes":"X","AxisType":0,"UnitInfo":{"UnitId":"601988e7-06a1-4dfd-9bba-535989b3afba","SubunitId":"00000000-0000-0000-0000-000000000000"},"IsMinLessThanMax":true}},{"Key":{"AxisType":1,"UnitInfo":{"UnitId":"250f1aea-b8e3-4a4d-98e0-f60abded10a4","SubunitId":"94d2baf0-3bc0-41f7-b207-d8ce54e65e35"}},"Value":{"Units":"in/s rms","MaxScale":0.015,"MinScale":0,"IsAuto":false,"Axes":"Y","AxisType":1,"UnitInfo":{"UnitId":"250f1aea-b8e3-4a4d-98e0-f60abded10a4","SubunitId":"94d2baf0-3bc0-41f7-b207-d8ce54e65e35"},"IsMinLessThanMax":true}}]}],"PlotIdVsLocalScaleType":[{"Key":"5ef394a9-98ad-4f52-b916-b698ae4ef351","Value":2}],"PlotIdVsPersistentScaleData":[{"Key":"5ef394a9-98ad-4f52-b916-b698ae4ef351","Value":[{"Key":{"AxisType":0,"UnitInfo":{"UnitId":"601988e7-06a1-4dfd-9bba-535989b3afba","SubunitId":"00000000-0000-0000-0000-000000000000"}},"Value":{"ManualScaleRange":{"MaxScale":400,"MinScale":0.062},"IsVisibleOnView":true,"IsAutoChecked":false,"AreManualScalesSet":true}},{"Key":{"AxisType":1,"UnitInfo":{"UnitId":"250f1aea-b8e3-4a4d-98e0-f60abded10a4","SubunitId":"94d2baf0-3bc0-41f7-b207-d8ce54e65e35"}},"Value":{"ManualScaleRange":{"MaxScale":0.015,"MinScale":0},"IsVisibleOnView":true,"IsAutoChecked":false,"AreManualScalesSet":true}}]}]}

РЕШЕНИЕ: я изменил класс в соответствии с предложением каждого, как показано ниже.Это прекрасно работает для меня

public class PlotSetFeatureStateInfo
        {

            public List<KeyValuePair<int, List<KeyValuePair<AxisTypeAndUnitInfo, ManualScaleInfo>>>> PersistentScaleInfo
            {
                get;
                set;
            }


            public List<KeyValuePair<Guid, ScaleType>>PlotIdVsLocalScaleType { get; set; }

            public List<KeyValuePair<Guid,List<KeyValuePair<AxisTypeAndUnitInfo, 
          PlotScales.PersistentScaleData>>>> PlotIdVsPersistentScaleData { get; set; }
        }

Спасибо:)

...