Deserialize List & lt; string & gt; с полем поддержки строки, используя json.net [duplicate]

Он - среди других применений - ярлык для инициализации коллекций. Подробнее ...

2
задан WHol 9 November 2015 в 12:46
поделиться

1 ответ

Ваша проблема в том, что при десериализации коллекции, которая не доступна только для чтения, Json.NET проверяет, была ли коллекция уже выделена, например, в конструкторе содержащего типа. Если это так, он заполняет уже существующую коллекцию для десериализованного содержимого JSON и никогда не устанавливает коллекцию обратно. К сожалению, ваше свойство возвращает временную коллекцию прокси, поэтому ваш контейнерный класс SpecialObject никогда не получает десериализованные результаты.

Самый простой способ предотвратить это - указать, что Json.NET должен всегда выделять новую коллекцию и установите его обратно, а не повторно используйте ранее существовавшую коллекцию, используя настройку JsonPropertyAttribute ObjectCreationHandling = ObjectCreationHandling.Replace

[JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)]
public List<string> SpecialObjectIDs { get { return SpecialObjectCollection.Select(x => x.ID).ToList(); } set { tempObjectIDs = value; } }

Альтернативно вы можете использовать string [], а не List<string> для вашего свойства для сбора прокси:

public string [] SpecialObjectIDs { get { return SpecialObjectCollection.Select(x => x.ID).ToArray(); } set { tempObjectIDs = value == null ? null : value.ToList(); } }

Поскольку массивы не могут быть изменены, Json.NET всегда будет выделять новый массив при десериализации и установить его после завершения.

2
ответ дан dbc 19 August 2018 в 10:27
поделиться
  • 1
    Спасибо, что сработали! Это похоже на неясную проблему, когда я раньше ходил по дороге, мне удалось вызвать ошибку, которая намекала на «tempObjectIDs». уже существующий, я удивлен, что он не просто выбрал исключение в моем примере кода. – WHol 9 November 2015 в 13:09
Другие вопросы по тегам:

Похожие вопросы: