7

JSON.NET obsługuje okrągły serializacji odniesienia zachowując wszystkie odwołania z następującymi ustawieniami:Czy istnieje biblioteka JSON JavaScript (po stronie klienta), która dobrze integruje się z JSON.NET (po stronie serwera) i obsługuje funkcję "zachowaj odwołania"?

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 
settings.PreserveReferencesHandling = PreserveReferencesHandling.All; 

który pozwala następujący kod do uruchomienia bez błędów, właściwie szeregowania i deserializacji obiektu z jego samoodniesienia nienaruszonym.

public class SelfReferencingClass 
{ 
    public string Name; 
    public SelfReferencingClass Self; 
    public SelfReferencingClass() {Name="Default"; Self=this;} 
} 

SelfReferencingClass s = new SelfReferencingClass(); 
string jsondata = JsonConvert.SerializeObject(d, settings); 
s = JsonConvert.DeserializeObject<SelfReferencingClass>(jsondata, settings); 

jsondata ciąg wygląda następująco:

{"$id":"1","Name":"Default","Self":{"$ref":"1"}} 

Problemem jest ... jak to jest cechą Json.NET przydatna w ogóle bez odpowiedniej stronie klienta JavaScript biblioteki, które można interpretować te referencje , a także wspierać kodowanie takich samych odniesień?

Która biblioteka po stronie klienta (np. JSON.stringify) obsługuje tę funkcję/kodowanie przy użyciu pól "$ id" i "$ ref"? Jeśli nie istnieje, czy istnieje znany sposób dodania obsługi do istniejącej biblioteki?

Samo dodawanie wsparcia byłoby dość prostym dwudrożnym procesem. Najpierw deserializuj cały łańcuch, a podczas tworzenia każdego obiektu dodaj go do słownika, używając jako klucza wartości "$ id". Gdy napotkasz odniesienia (obiekt składający się tylko z właściwości "$ ref") możesz dodać go do listy obiektów + nazw pól, które możesz cofnąć, aby zastąpić każde napotkane odniesienie, szukając jego klucza w ostatecznym słowniku utworzonych obiektów .

+0

Szukałem wszędzie rozwiązania. Wydaje się, że istnieje coś takiego jak "dojo" (http://www.sitepen.com/blog/2008/06/17/json-referencing-in-dojo/), które również ma takie wsparcie, ale jest także serwerowe. po stronie i nie wydaje się zawierać "$" w polu id, więc nie jest to nawet zgodne ze sposobem, w jaki JSON.NET obsługuje kodowanie odniesienia. – Triynko

+0

Serializator JSON 3 http://bestiejs.github.io/json3/ również nie obsługuje cyklicznego odniesienia i spowoduje błąd. Komentarz do kodu to "// Struktury cykliczne nie mogą być serializowane przez' JSON.stringify'. ' – Triynko

+1

to pytanie zawiera odpowiedź: http://stackoverflow.com/questions/13782052/using-javascript-to-deserialize-references-in-a-complex-object-graph-from-signal –

Odpowiedz

2

Istnieje kilka opcji:

  1. oryginalna biblioteka JSON Douglasa Crockforda zawiera plugin o nazwie cycle.js że rozwiązane referencje okrężne. Zobacz także tę odpowiedź, która ma ulepszoną wersję metody do rozwiązywania odniesień: Resolve circular references from JSON object.
  2. Cereal, które lepiej obsługuje odwołania kołowe i grafy obiektów.
  3. CircularJSON który jest bardzo mały i robi dokładnie to, co mówi.

Powiedziawszy to, prawdopodobnie pomogłabym w rozwiązaniu mojego projektu, aby uniknąć odniesień kołowych, ponieważ JSON jest zazwyczaj komponentem rdzeniowym i prawdopodobnie chciałbyś używać bibliotek głównego nurtu, który jest bardzo dobrze przetestowany i obsługiwany. Jednym ze sposobów unikania odwołań cyklicznych jest tworzenie lekkich obiektów shim i przekształcanie ich do postaci szeregowej. Alternatywnie możesz zaimplementować niestandardowy interfejs (jeśli masz dostęp do klasy), który zastępuje zachowanie serializacji. Możesz prawdopodobnie zautomatyzować go za pomocą odbicia, aby uniknąć właściwości z odwołaniami cyklicznymi.