Dodawanie nowego obiektu do Listy pobranej z pliku json.

0

Witma.
Mam następujący problem, ładuje dane z pliku json.
Oto model w C#:

 public partial class Graph
    {
        [JsonProperty("Nodes")]
        public List<Node> Nodes { get; set; }
    }

    public partial class Node
    {
        [JsonProperty("Id")]
        public int Id { get; set; }

        [JsonProperty("Position")]
        public Position Position { get; set; }

        [JsonProperty("BorderNodes")]
        public List<BorderNode> BorderNodes { get; set; }
    }

    public partial class BorderNode
    {
        [JsonProperty("NodeId")]
        public int NodeId { get; set; }
    }

    public partial class Position
    {
        [JsonProperty("X")]
        public int X { get; set; }

        [JsonProperty("Y")]
        public int Y { get; set; }
    }

    public partial class Graph
    {
        public static Graph FromJson(string json) => JsonConvert.DeserializeObject<Graph>(json, MapControler.Converter.Settings);
    }
    public static class Serialize
    {
        public static string ToJson(this Graph self) => JsonConvert.SerializeObject(self, MapControler.Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters =
            {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }

i
przykładowe dane w json:

{"Nodes":[
{"Id":0,"Position":{"X":520,"Y":430},"BorderNodes":[{"NodeId":1},{"NodeId":3}]},
{"Id":1,"Position":{"X":625,"Y":439},"BorderNodes":[{"NodeId":2},{"NodeId":0}]},
{"Id":2,"Position":{"X":668,"Y":525},"BorderNodes":[{"NodeId":1}]},
{"Id":3,"Position":{"X":479,"Y":417},"BorderNodes":[{"NodeId":0},{"NodeId":4}]},
{"Id":4,"Position":{"X":446,"Y":429},"BorderNodes":[{"NodeId":3}]}]}

gdy za pomocą polecenia

List<BorderNode> newBorders = new List<BorderNodes>();
newBorders.Add(new BorderNode{NodeId = 3}, NodeId = 0});
TestGraph.Nodes.Add(new Node{
Id=5,
new Position{X = 100, Y = 100},
newBorders
 });

dodaję nowy Node wszystko działa
a gdy do już istniejącego noda i istniejącej listy BorderNodes próbuje dodać nowy BorderNode wywala mi program.

TestGraph.Nodes.Find(p => p.Id == 3).BorderNodes.Add(new BorderNode(){NodeId = 5});

Próbowałem już wielu sposobów i szukałem w necie ale nie mogę znaleźć rozwiązania.

0

Wywala to znaczy co? Wyjątek? Jaki?
Dobre parsery JSON (czy XML też) z marzeń by zwracały niezmiennicze (immutable) obiekty i listę też.
Czym to wczytujesz?

0

Cały model c# został wygenerowany na json2cshap.com wraz z metodami do serializacji. Model znajduję się w bibliotece .net standard. Robiłem to na platformie .net core 3.1 w wpf-ie i w consoli w obu przypadkach to samo. Nie wyrzuca wyjątku, wpf wywala program a w consoli po prostu nie dodaje obiektu do listy.

Jednak w consoli działa w porządku tylko w wpf-ie wywala program.

0

Jeżeli wywala program w WPF nigdy mi się nie zdarzyło aby go wywaliło bez podania przyczyny. na 100% jest przyczyna napisana. Wklej ją tu to powiem Ci co może być nie tak :)

0

Częściowo rozwiązałem problem. Do istniejącej już listy dodawałem nowy element przy zdażeniu

imageMap.MouseLeftButtonDown += OnMouse;
Position position;
private void OnMouse (object sender, MouseButtonEventArgs e) {
   position = e.MouseDevice.GetPosition (imageMap);
   Node borderNode = imageMap.MapInfo.MapNodes.FindNearestNode ((int) position.X, (int) position.Y);
   TestGraph.Nodes.Find(p => p.Id == borderNode.NodeId).BorderNodes.Add(new BorderNode(){NodeId = currentNode.Id});
}

i wywalało program a gdy dodam element po kliknięciu przycisku wszytko działa

Position position;
private void OnMouse (object sender, MouseButtonEventArgs e) {
   position = e.MouseDevice.GetPosition (imageMap);

}

public void OnAddNodeClicked (object sender, EventArgs eventArgs) {
   Node borderNode = imageMap.MapInfo.MapNodes.FindNearestNode ((int) position.X, (int) position.Y);
   TestGraph.Nodes.Find(p => p.Id == borderNode.NodeId).BorderNodes.Add(new BorderNode(){NodeId = currentNode.Id});
}

Funkcja pomocnicza:

 public partial class Graph
    {
        public Node FindNearestNode(int x, int y)
        {
            double lenght = 1000;
            Node nearestNode = Nodes.First();
            foreach(var item in Nodes)
            {
                var newLenght =Math.Sqrt(
                    (item.Position.X - x) * (item.Position.X - x) +
                    (item.Position.Y - y) * (item.Position.Y - y)
                    );
                    if(lenght > newLenght)
                    {
                    lenght = newLenght;
                    nearestNode = item;
                    }
            }
            return nearestNode;
        }
    }

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