Also, - in meinem DocumentDB kann ich folgendes Dokument habe:Azure-Service-Fabric und DocumentDB Nachricht Serialisierung Ausgabe
{
"id": 1,
"type": "A",
"content": {
"x": 1,
"y": 2
}
}
, die von diesem Modell unterstützt werden kann:
public class acontent
{
public int x { get; set; }
public int y { get; set; }
}
public class document
{
public int id { get; set; }
public string type { get; set; }
public object content { get; set; }
}
public class documenta : document
{
public new acontent content { get; set; }
}
Die Idee hier Ist dieses Dokument ein komplexes Objekt, kann der Inhalt je nach Typ variieren.
Nun - in meiner ServiceFabric Anwendung habe ich eine stateless Micro, die von DocumentDB liest und sollte ein Dokument Typ Objekt zurück, wenn aus dem ServiceProxy genannt.
Das Problem dabei ist, dass die DocumentQuery aus dem DocumentDB SDK, Json.NET Serializer verwendet, wenn die Datenbank abfragen, während servicefabric DataContractSerializer verwendet für die Service-Nachrichten Serialisierung. So
wenn die Inhalt Teil Dokument Klasse aus dem DocumentDB deserialisiert wird es wird:
Newtonsoft.Json.Linq.JObject
Aber wenn es zurück durch die zurücke Service-Nachricht ist serialisiert erhalten Sie die Ausnahme:
Typ 'Newtonsoft.Json.Linq.JToken' ist ein rekursiver Sammlungsdaten Vertrag, der nicht unterstützt wird. Erwägen Sie, die Definition der Kollektion 'Newtonsoft.Json.Linq.JToken' zu ändern, um Verweise auf selbst zu entfernen.
dieses Problem zu veranschaulichen den Folowing Code versuchen:
using System;
using System.IO;
using System.Text;
using System.Runtime.Serialization.Json;
using Newtonsoft.Json;
namespace jsoinissue
{
public class acontent
{
public int x { get; set; }
public int y { get; set; }
}
public class document
{
public int id { get; set; }
public string type { get; set; }
public object content { get; set; }
}
public class documenta : document
{
public new acontent content { get; set; }
}
public class Program
{
private const string JSON_A = "{\"id\":1,\"type\":\"A\",\"content\":{\"x\":1,\"y\":2}}";
private static string SerializeObject<T> (T obj)
{
try
{
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(T));
using (var ms = new MemoryStream())
{
js.WriteObject(ms, obj);
ms.Position = 0;
using (var sr = new StreamReader(ms))
return sr.ReadToEnd();
}
}
catch (Exception e)
{
return String.Format("EXCEPTION: {0}",e.Message);
}
}
public static void Main()
{
var A = JsonConvert.DeserializeObject<document>(JSON_A);
var a = SerializeObject<document>(A);//HERE BE TROUBLE
Console.WriteLine(a);
Console.ReadKey();
}
}
}
Wie könnte ich dieses Problem am besten lösen?
'DataContractJsonSerializer' unterstützt nicht wirklich das Deserialisieren und Serialisieren von JSON-Daten in freier Form, so wie' DataContractSerializer' keine freien XML-Daten unterstützt. Ich würde vorschlagen, dass Sie Ihr Datenmodell vollständig statisch ändern. Ist das möglich? – dbc
dbc, - Nun, ich habe gehofft, eine Lösung zu entwickeln, die in der Lage ist, solche komplexen Typen zu handhaben. Der Microservice sollte nur nach ID und Typ fragen, wo die weitere Serialisierung vom Service-Aufrufer downstream durchgeführt werden soll. – ifxdev
Ist der Inhalt immer ein einfaches JSON-Objekt oder könnte er mehrere verschachtelte Ebenen von Objekten oder Arrays enthalten? I.e. Wäre ein 'Dictionary' ausreichend? –
dbc