Home > Software design >  JsonConvert.DeserializeObject loading data types but not data values
JsonConvert.DeserializeObject loading data types but not data values

Time:03-03

My program gives the user the option to serialize a certain list List<Position>ListPosition that stores the data from the class Position. It does serialize pretty well and it sorta looks like the following

{
    "PosZ": 0,
    "PosX": 749,
    "PosY": 208,
    "Agent": {
      "IsEdgeTree": false,
      "ThisTreesCreator": null,
      "Type": 0,
      "Colour": "Green",
      "Dimension": 25
    }
  },
  {
    "PosZ": 0,
    "PosX": 724,
    "PosY": 183,
    "Agent": {
      "IsEdgeTree": false,
      "ThisTreesCreator": {
        "IsEdgeTree": false,
        "Position": {
          "PosZ": 0,
          "PosX": 749,
          "PosY": 208
        },
        "ThisTreesCreator": null,
        "Type": 0,
        "Colour": "Green",
        "Dimension": 25
      },
      "Type": 0,
      "Colour": "Green",
      "Dimension": 25
    }
  },

These are just a few examples.

The bit that is giving me problems is when I deserialize it.

When I inspect the bit of code that converts it JsonConvert.DeserializeObject<List<Position>>(JsonString);, everything reads fine but, when I equal it to the List I am trying to dump the data to AKA the same list the serialized data comes from but empty, the data doesn't load and I'm left with the correct structure but no values.

Values not showing up

To Deserialize, I call the following method from another Windows Forms:

public static void Deserialize()
        {
            if (Directory.Exists("Serialized"))
            {
                var FileName = "Serialized/PositionsSerialized_4.json";
                var JsonString = File.ReadAllText(FileName);                
                ListPositions = JsonConvert.DeserializeObject<List<Position>>(JsonString);
            }
            else
                MessageBox.Show("There's no directory");
        }

I would really appreciate some help. If more information is needed, be sure to request it in the comments. Thank you for your time.

public class Position
    {
        public static int MaxX { get; private set; }
        public static int MaxY { get; private set; }

        public static List<Position> ListPositions { get; private set; }
        public static List<Position> ListTreePositions {
            get
            {
                return ListPositions.Where(w => w.Agent?.Type == AgentType.Tree).ToList();
            }
        }
        public static List<Position> ListDronePositions
        {
            get
            {
                return ListPositions.Where(w => w.Agent?.Type == AgentType.Drone).ToList();
            }
        }
        public int PosX { get; private set; }
        public int PosY { get; private set; }
        public int PosZ;
        private static object services;

        public Agent Agent { get; private set; }

        public Position()
        {
            ListPositions = new List<Position>();
        }

        public static void SetMaxValues(int maxX, int maxY)
        {
            MaxX = maxX;
            MaxY = maxY;
        }

        public void FillNeighbours(int posX, int posY, int dim)
        {
            for (int i = 0; i < dim; i  )
            {
                for (int y = 0; y < dim; y  )
                {
                    new Position(posX - (dim - y), posY - (dim - i), Agent);
                }
            }
        }
        public static Position CreateNewRandomPosition()
        {
            Random rnd = new Random();
            int rndX;
            int rndY;
            Position position = null;
            while (position == null)
            {
                rndX = rnd.Next(MaxX - 100);
                rndY = rnd.Next(MaxY - 100);
                position = CreatePosition(rndX, rndY);
            }
            return position;
        }

        public static Bitmap ExportBitmap()
        {
            return ExportBitmap(0, 0, MaxX, MaxY, ListPositions);
        }
        public static Bitmap ExportBitmap(int posX, int posY, int maxX, int maxY)
        {
            var listPositions = ListPositions.Where(w => (w.Agent != null) && (w.PosX >= posX && w.PosX <= maxX) && (w.PosY >= posY && w.PosY <= maxY)).ToList();
            return ExportBitmap(posX, posY, maxX, maxY, listPositions);
        }
        public static Bitmap ExportBitmap(int posX, int posY, int maxX, int maxY, AgentType agentType)
        {
            var listPositions = ListPositions.Where(w => (w.Agent.Type == agentType) && (w.PosX >= posX && w.PosX <= maxX) && (w.PosY >= posY && w.PosY <= maxY)).ToList();
            return ExportBitmap(posX, posY, maxX, maxY, listPositions);
        }
        public static Bitmap ExportBitmap(int posX, int posY, int maxX, int maxY, AgentType[] agentType)
        {
            var listPositions = ListPositions.Where(w => (agentType.Contains(w.Agent.Type)) && (w.PosX >= posX && w.PosX <= maxX) && (w.PosY >= posY && w.PosY <= maxY)).ToList();
            return ExportBitmap(posX, posY, maxX, maxY, listPositions);
        }
        private static Bitmap ExportBitmap(int posX, int posY, int maxX, int maxY, List<Position> positions)
        {
            Bitmap bmp = new Bitmap(maxX - posX, maxY - posY);
            if (Agent.Sprites.Count() == 0)
            {
                Agent.LoadSprites();
            }
            Graphics g = Graphics.FromImage(bmp);

            foreach (var item in positions)
            {
                var SpriteWidth = Agent.Sprites[item.Agent.Type].Width / 2;
                var SpriteHeight = Agent.Sprites[item.Agent.Type].Height / 2;
                g.DrawImage(Agent.Sprites[item.Agent.Type], new Point(item.PosX - SpriteWidth - posX, item.PosY - SpriteHeight - posY));
            }

            if (!Directory.Exists("Photos"))
            {
                Directory.CreateDirectory("Photos");
            }
            int count = Directory.GetFiles("Photos", "*").Length;
            bmp.Save("Photos\\Img"   count   1   ".png", System.Drawing.Imaging.ImageFormat.Png);

            return bmp;
        }
        public Position(int poxX, int poxY)
        {
            PosX = poxX;
            PosY = poxY;
            if (Agent != null)
                ListPositions.Add(this);
        }
        public Position(int posX, int posY, Agent agent)
        {
            PosX = posX;
            PosY = posY;
            Agent = agent;
            if (Agent != null)
                ListPositions.Add(this);
        }
        public void AssociateAgent(Agent agent)
        {
            Agent = agent;
            if (Agent != null)
                ListPositions.Add(this);
        }
        public static bool CheckPositionIsValid(int poxX, int poxY)
        {
            int? NullableMaxX = MaxX;
            int? NullableMaxY = MaxY;
            var posXValid = poxX > 0 && (poxX <= MaxX || NullableMaxX == null); //verifies if posX is within the boundries of the premises
            var posYValid = poxY > 0 && (poxY <= MaxY || NullableMaxY == null); //verifies if posY is within the boundries of the premises
            return posXValid && posYValid; //returns if they are both valid
        }
        public static Position Find(int poxX, int poxY)
        {
            return ListPositions.Find(f => f.PosX == poxX && f.PosY == poxY) ?? null;
        }
        public static Position CreatePosition(int poxX, int poxY)
        {
            if (Find(poxX, poxY) == null)
                if (CheckPositionIsValid(poxX, poxY))
                    return new Position(poxX, poxY);
                else
                    return null;
            else
                return null;
        }
        public Dictionary<int, Position> ListNeighbourPositions(int dim = 1)
        {
            Dictionary<int, Position> NeighbourList = new Dictionary<int, Position>();
            for (int i = 1; i < 9; i  )
            {
                if (i != 5)
                {
                    var position = FindNeighbour(i, dim);
                    if (position != null)
                        NeighbourList.Add(i, position);
                }
            }
            return NeighbourList;
        }
        public Position FindNeighbour(int neighbourPos, int dim)
        {
            var position = FindNeighbourbyPosition(neighbourPos, dim);
            return Find(position.Item1, position.Item2);
        }
        public Tuple<int, int> FindNeighbourbyPosition(int neighbourPos, int dim = 1)
        {
            int neighbourPosX;
            int neighbourPosY;

            switch (neighbourPos)
            {
                case 1:
                    neighbourPosX = PosX - dim;
                    neighbourPosY = PosY - dim;
                    break;
                case 2:
                    neighbourPosX = PosX;
                    neighbourPosY = PosY - dim;
                    break;
                case 3:
                    neighbourPosX = PosX   dim;
                    neighbourPosY = PosY - dim;
                    break;
                case 4:
                    neighbourPosX = PosX - dim;
                    neighbourPosY = PosY;
                    break;
                case 6:
                    neighbourPosX = PosX   dim;
                    neighbourPosY = PosY;
                    break;
                case 7:
                    neighbourPosX = PosX - dim;
                    neighbourPosY = PosY   dim;
                    break;
                case 8:
                    neighbourPosX = PosX;
                    neighbourPosY = PosY   dim;
                    break;
                case 9:
                    neighbourPosX = PosX   dim;
                    neighbourPosY = PosY   dim;
                    break;
                default:
                    return null;
            }
            return new Tuple<int, int>(neighbourPosX, neighbourPosY);
        }
        public void UpdatePosition(int newX, int newY)
        {
            PosX = newX;
            PosY = newY;
        }
        public static void Serialize()
        {
            if (!Directory.Exists("Serialized"))
            {
                Directory.CreateDirectory("Serialized");
            }
            int count = Directory.GetFiles("Serialized", "*").Length;

            string fileName = "Serialized/PositionsSerialized_"   count   ".json";
            string jsonString = JsonConvert.SerializeObject(ListPositions, Formatting.Indented, new JsonSerializerSettings()
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            });
            File.WriteAllText(fileName, jsonString);
        }

        public static void Deserialize()
        {
            if (Directory.Exists("Serialized"))
            {
                var FileName = "Serialized/PositionsSerialized_4.json";
                var JsonString = File.ReadAllText(FileName);                
                ListPositions = JsonConvert.DeserializeObject<List<Position>>(JsonString);
            }
            else
                MessageBox.Show("There's no directory");
        }
    }

CodePudding user response:

The reason of your problem is because you defined setters as private...

    public static int MaxX { get; private set; }
    public static int MaxY { get; private set; }
    public int PosX { get; private set; }
    public int PosY { get; private set; }

it should be...

    public static int MaxX { get; set; }
    public static int MaxY { get; set; }
    public int PosX { get; set; }
    public int PosY { get; set; }
  • Related