2016-11-19 5 views
0

Мне нужно использовать более старую версию Json.Net (наш ESB использует ее), которая старше 4.5.2.Как я могу сериализовать и десериализовать динамику как IDictionary <string, object> в Json.Net

Существует утечка памяти для классов на основе DynamicObject.

Я использую 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 в состоянии Array приведет к недопустимому объекту JSON. Путь« $ values ​​». 3- Утечка памяти в старой версии Json.Net. Версия, которую мы так старательно видели, я вижу информацию об утечке в истории версий. – ozz

+0

Легко сериализовать объект «как». У меня есть DynamicObject и ı хочу сериализовать его как IDictionary Он должен быть простым с помощью JsonConverter, но нет, я думаю, что мне что-то не хватает – ozz

ответ

1

В отсутствие mcve могут быть и другие проблемы, связанные с вашим кодом, но вам нужно удалить внутренний звоните в WriteEndObject() из WriteJson():

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

Только информация типа $ отсутствует, но другая часть работает, как я могу писать $ типа? Я использую эти параметры во время сериализации: 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