2016-11-19 67 views
0

我必须使用旧版本的Json.Net(我们的ESB使用它)比4.5.2早。我怎样才能序列化和反序列化动态作为IDictionary <string,object>在Json.Net

基于DynamicObject的类存在内存泄漏。

我使用Rick的为Expando类https://github.com/RickStrahl/Expando

我想序列化我为Expando对象的IDictionary和反序列化作为我为Expando对象

我试图用CustomJsonConverter你可以看到:

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)没有简单的方法:

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

1)什么版本的Json.NET? 2)*但是我每次尝试实现WriteJson时都会出现奇怪的错误* - 您得到了哪些错误?你期望得到什么? 3)*基于DynamicObject的类存在内存泄漏。* - 你的意思是Json.NET或其他内容泄漏吗? – dbc

+0

1-版本早于4.5 2-其中之一是“状态数组中的Token PropertyName会导致无效的JSON对象,路径'$ values'。” 3-内存泄漏Json.Net的旧版本,我们使用的版本太旧,你可以看到,我可以看到版本历史中的泄漏信息 – ozz

+0

它很容易序列化对象“为”。我有DynamicObject和ı想序列化为IDictionary <字符串,对象>它必须通过JsonConverter简单但不是,我想我错过了一些东西 – ozz

回答

1

在没有mcve的可能还有其他问题与您的代码,但是你需要删除内从WriteJson()来电WriteEndObject()

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(); 
} 

呼叫至WriteStartObject()WriteEndObject()应该配对。

+0

只有$ type信息缺席,但其他部分工作,我怎么写$类型?我在序列化过程中使用这个设置:SerializationSettings.TypeNameHanling = TypeNameHandling.All; – ozz

+0

@ozz - 你需要创建一个[mcve]完全展示你在做什么。另外,关于stackoverflow的问题的首选格式是[每个帖子一个问题](https://meta.stackexchange.com/questions/222735/can-i-ask-only-one-question-per-post)。一般来说,当存在一个转换器时,它负责编写所有属性,包括'“$ type”'。 – dbc

+0

主对象和属性都没有$ type信息。有$类型,但值是空字符串。 – ozz