だから、私のDocumentDBに私は、次の書類を持っていることがあります。ここにAzureのサービス・ファブリックとDocumentDBメッセージのシリアル化の問題
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; }
}
アイデア:このモデルによってバックアップすることができる
{
"id": 1,
"type": "A",
"content": {
"x": 1,
"y": 2
}
}
その文書は種類によって内容が異なる複雑なオブジェクトです。今
、 - 私のServiceFabricアプリケーションでは、私はDocumentDBから読み込み、ServiceProxyから呼び出されたときに文書型オブジェクトを返す必要がありますステートレスmicroserviceを持っています。
DocumentDB SDKのDocumentQueryはデータベース照会時にJson.NETシリアライザを使用し、servicefabricはサービスメッセージのシリアル化にDataContractSerializerを使用しています。
Newtonsoft.Json.Linq.JObject
しかし、それはあなたが例外を取得返さサービスメッセージを通じてバックシリアライズされています:
だから、 の内容一部文書クラスは、それがなっDocumentDBから直列化復元されている
タイプ 'Newtonsoft.Json.Linq.JToken'は、再帰的なコレクションデータ 契約であり、サポートされていません。 コレクション 'Newtonsoft.Json.Linq.JToken'の定義を変更して、 への参照を削除することを検討してください。
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(); } } }
どのように私は最高のこの問題を解決することができます:
は、この問題はfolowingコードを試す説明するために?
'DataContractJsonSerializer'では、フリーフォームのJSONデータのデシリアライズとシリアライズをサポートしていません。ちょうど' DataContractSerializer'がフリーフォームXMLデータをサポートしていないのと同じです。あなたのデータモデルを静的に完全に何かに変更することをお勧めします。それは可能ですか? – dbc
dbc、このような複雑な型を扱うことができるソリューションを構築したいと思っていました。マイクロサービスはidと型を照会するだけで、サービスの呼び出し側が下流でさらにシリアライズを実行する必要があります。 – ifxdev
コンテンツは常に単純なJSONオブジェクトですか、複数のオブジェクトまたは配列のネストされたレベルを持つことができますか?私。 'Dictionary'で十分でしょうか? –
dbc