Deserializacja jsona

0
[ 
   { 
      "$type":"Engine.GameUtility.Map.Elements.FloorType.RegularIce, multi",
      "FloorPolygon":{ 
         "$type":"Engine.GameUtility.Physic.Polygon, multi",
         "Name":"RegularIce",
         "Points":[ 
            { 
               "$type":"Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
               "Position":"25.6487427, 0.999984741, 45.6729431",
               "Color":{ 
                  "$type":"Microsoft.Xna.Framework.Color, MonoGame.Framework",
                  "B":226,
                  "G":43,
                  "R":138,
                  "A":255
               }
            },
            { 
               "$type":"Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
               "Position":"71.1590652, 0.999984741, 22.8849335",
               "Color":{ 
                  "$type":"Microsoft.Xna.Framework.Color, MonoGame.Framework",
                  "B":226,
                  "G":43,
                  "R":138,
                  "A":255
               }
            },
            { 
               "$type":"Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
               "Position":"71.1590652, 0.999984741, 22.8849335",
               "Color":{ 
                  "$type":"Microsoft.Xna.Framework.Color, MonoGame.Framework",
                  "B":226,
                  "G":43,
                  "R":138,
                  "A":255
               }
            },
            { 
               "$type":"Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
               "Position":"98.05392, 1, 47.6578064",
               "Color":{ 
                  "$type":"Microsoft.Xna.Framework.Color, MonoGame.Framework",
                  "B":226,
                  "G":43,
                  "R":138,
                  "A":255
               }
            },
            { 
               "$type":"Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
               "Position":"98.05392, 1, 47.6578064",
               "Color":{ 
                  "$type":"Microsoft.Xna.Framework.Color, MonoGame.Framework",
                  "B":226,
                  "G":43,
                  "R":138,
                  "A":255
               }
            },
            { 
               "$type":"Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
               "Position":"87.09056, 1.00001526, 95.42665",
               "Color":{ 
                  "$type":"Microsoft.Xna.Framework.Color, MonoGame.Framework",
                  "B":226,
                  "G":43,
                  "R":138,
                  "A":255
               }
            },
            { 
               "$type":"Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
               "Position":"87.09056, 1.00001526, 95.42665",
               "Color":{ 
                  "$type":"Microsoft.Xna.Framework.Color, MonoGame.Framework",
                  "B":226,
                  "G":43,
                  "R":138,
                  "A":255
               }
            },
            { 
               "$type":"Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
               "Position":"21.58714, 1, 86.7207642",
               "Color":{ 
                  "$type":"Microsoft.Xna.Framework.Color, MonoGame.Framework",
                  "B":226,
                  "G":43,
                  "R":138,
                  "A":255
               }
            },
            { 
               "$type":"Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
               "Position":"21.58714, 1, 86.7207642",
               "Color":{ 
                  "$type":"Microsoft.Xna.Framework.Color, MonoGame.Framework",
                  "B":226,
                  "G":43,
                  "R":138,
                  "A":255
               }
            },
            { 
               "$type":"Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
               "Position":"25.6487427, 0.999984741, 45.6729431",
               "Color":{ 
                  "$type":"Microsoft.Xna.Framework.Color, MonoGame.Framework",
                  "B":226,
                  "G":43,
                  "R":138,
                  "A":255
               }
            }
         ]
      },
      "Hidden":false,
      "ControllType":{ 
         "$type":"Engine.GameUtility.Control.NormalControll, multi",
         "ClickPosition":"0, 0",
         "DestinationVector":"0, 0",
         "SideMultiplier":0,
         "GroundSpeed":1.6,
         "TESTANGLE":""
      },
      "Key":"test"
   }
]

           StreamReader MapWriter = new StreamReader("pasta\\CollisionStructure0.json");
           List<IFloor> objectMap = JsonConvert.DeserializeObject<List<IFloor>>(MapWriter.ReadToEnd(),
                new JsonSerializerSettings()
                {
                    TypeNameHandling = TypeNameHandling.Objects
                });
            MapWriter.Close();

Error

Newtonsoft.Json.JsonSerializationException: 'Error converting value "25.6487427, 0.999984741, 45.6729431" to type 'Microsoft.Xna.Framework.Vector3'. Path '[0].FloorPolygon.Points[0].Position', line 10, position 63.'

ArgumentException: Could not cast or convert from System.String to Microsoft.Xna.Framework.Vector3.

Jakieś pomysły? Dodam że ten json w innym miejscu działa bez problemu.

0

Jeżeli problem jest rzeczywiście z deserializowaniem VertexPositionColor (tak jak masz w błędzie), może spróbuj wyrzucić samą kolecję pozycji do JSON'a i sprawdź czy się dobrze deserializują. tj. zamiast tego IFloor (i całej otoczki Twojego(?) silnika), sprawdź tylko:

            StreamReader MapWriter = new StreamReader("test.json");
            List<VertexPositionColor> objectMap = JsonConvert.DeserializeObject<List<VertexPositionColor>>(MapWriter.ReadToEnd(),
                 new JsonSerializerSettings()
                 {
                     TypeNameHandling = TypeNameHandling.Objects
                 });
            MapWriter.Close();

Gdzie test.json to wydłubany z Twojego JSON'a

[
        {
          "$type": "Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
          "Position": "25.6487427, 0.999984741, 45.6729431",
          "Color": {
            "$type": "Microsoft.Xna.Framework.Color, MonoGame.Framework",
            "B": 226,
            "G": 43,
            "R": 138,
            "A": 255
          }
        },
        {
          "$type": "Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
          "Position": "71.1590652, 0.999984741, 22.8849335",
          "Color": {
            "$type": "Microsoft.Xna.Framework.Color, MonoGame.Framework",
            "B": 226,
            "G": 43,
            "R": 138,
            "A": 255
          }
        },
       .....
      ]

po mojej stronie cała kolekcja się spoko deserializuje. Ale być może wstawiłeś inny JSON niż ten który sprawia problem?
W następnym kroku, "przywraciłbym" typy opakowujące kolekcję pozycji, itd - ale spodziewałbym się, że to wartośći w pozycji powodują problem z deserializacją (błąd jest dość precyzyjny).

0
stic napisał(a):

Jeżeli problem jest rzeczywiście z deserializowaniem VertexPositionColor (tak jak masz w błędzie), może spróbuj wyrzucić samą kolecję pozycji do JSON'a i sprawdź czy się dobrze deserializują. tj. zamiast tego IFloor (i całej otoczki Twojego(?) silnika), sprawdź tylko:

            StreamReader MapWriter = new StreamReader("test.json");
            List<VertexPositionColor> objectMap = JsonConvert.DeserializeObject<List<VertexPositionColor>>(MapWriter.ReadToEnd(),
                 new JsonSerializerSettings()
                 {
                     TypeNameHandling = TypeNameHandling.Objects
                 });
            MapWriter.Close();

Gdzie test.json to wydłubany z Twojego JSON'a

[
        {
          "$type": "Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
          "Position": "25.6487427, 0.999984741, 45.6729431",
          "Color": {
            "$type": "Microsoft.Xna.Framework.Color, MonoGame.Framework",
            "B": 226,
            "G": 43,
            "R": 138,
            "A": 255
          }
        },
        {
          "$type": "Microsoft.Xna.Framework.Graphics.VertexPositionColor, MonoGame.Framework",
          "Position": "71.1590652, 0.999984741, 22.8849335",
          "Color": {
            "$type": "Microsoft.Xna.Framework.Color, MonoGame.Framework",
            "B": 226,
            "G": 43,
            "R": 138,
            "A": 255
          }
        },
       .....
      ]

po mojej stronie cała kolekcja się spoko deserializuje. Ale być może wstawiłeś inny JSON niż ten który sprawia problem?
W następnym kroku, "przywraciłbym" typy opakowujące kolekcję pozycji, itd - ale spodziewałbym się, że to wartośći w pozycji powodują problem z deserializacją (błąd jest dość precyzyjny).

Próbowałem i jestem tak zdeterminowany żeby dać to w tablice float i dać jeszcze interpreter tej tablicy. Najgorsze że w grze i edytorze działa to bez zarzutu ale serwer piszczy...

1 użytkowników online, w tym zalogowanych: 0, gości: 1