2016-11-19 16 views
0

4.5.2より古い古いJson.Net(ESBが使用する)を使用する必要があります。Json.NetのIDictionary <文字列、オブジェクト>としてダイナミックをシリアル化および逆シリアル化する方法

DynamicObjectベースのクラスにメモリリークがあります。

私は私はあなたが見ることができるようCustomJsonConverterを使用しようとしましたIDictionaryのように私はExpandoオブジェクトをシリアル化し、私はExpandoオブジェクトとして

それをデシリアライズしたいリックのはExpandoクラスにhttps://github.com/RickStrahl/Expando

を使用しています:

public class ExpandoConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(Expando).IsAssignableFrom(objectType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
      return null; 

     JObject jObject = JObject.Load(reader); 
     // It is easier to write readJson I will implement 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var x = (value as Expando); 
     writer.WriteStartObject(); 
     foreach (var item in x.GetProperties(true)) 
     { 
      writer.WritePropertyName(item.Key); 

      serializer.Serialize(writer,item.Value); 

      writer.WriteEndObject(); 
     } 
     writer.WriteEndObject(); 
    } 

WriteJsonを実装しようとするたびに奇妙なエラーが発生します。

Token PropertyName in state Array would result in an invalid JSON object. Path '$values'.

(WriteJsonで)そのような任意の簡単な方法があります:あなたのコードと他の問題がある可能性がありmcveが存在しない場合には

var dictionary= ExpandoToDictionary(expando); 
serializer.Serialize(writer,dictionary); 
+1

1)Json.NETのバージョンは? 2)*しかし、私はWriteJson *を実装しようとするたびに奇妙なエラーが発生しています* - どのようなエラーが出ていますか?代わりに何を得ることを期待しましたか? 3)* DynamicObjectベースのクラスのメモリリークがあります。* - Json.NETなどのリークを意味しますか? – dbc

+0

1バージョンが4.5より古い2つのうちの1つが「状態配列のトークンPropertyNameは無効なJSONオブジェクトになります」パス '$ values'。 " 3 - Json.Netの古いバージョンでのメモリリーク、私が見たほど古くなったバージョン、バージョン履歴のリーク情報を見ることができます – ozz

+0

"as"オブジェクトをシリアライズするのは簡単です。私はDynamicObjectを持っていて、ıIDictionary としてシリアライズしたいのですが、JsonConverter経由でシンプルでなければならないが、何かが足りないと思う。 – ozz

答えて

1

は、しかし、あなたは、内側を削除する必要がありますWriteJson()からWriteEndObject()に呼び出す:WriteStartObject()とへ

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    var x = (value as Expando); 
    writer.WriteStartObject(); 
    foreach (var item in x.GetProperties(true)) 
    { 
     writer.WritePropertyName(item.Key); 

     serializer.Serialize(writer,item.Value); 

     // Do not close the object here also. 
    } 
    writer.WriteEndObject(); 
} 

コール0をペアにする必要があります。

+0

$タイプの情報は不在だが、他の部分は動作している$タイプ?私はシリアル化中にこの設定を使用しています:SerializationSettings.TypeNameHanling = TypeNameHandling.All; – ozz

+0

@ozz - 自分が行っていることを完全に示す[mcve]を作成する必要があります。また、stackoverflowに関する質問の好ましい形式は[投稿ごとに1つの質問](https://meta.stackexchange.com/questions/222735/can-i-ask-only-one-question-per- post)です。一般に、コンバータが存在するときは、 '' $ type ''を含むすべてのプロパティを記述しなければなりません。 – dbc

+0

メインオブジェクトとプロパティの両方に$タイプ情報はありません。 $ typeがありますが、値は空文字列です。 – ozz

関連する問題