Не удалось определить тип объекта JSON Исключение системного аргумента - PullRequest
1 голос
/ 16 октября 2019

Я хотел бы получить некоторую помощь по исключению ниже, с которым я сталкиваюсь при попытке установить значение для объекта JSON. enter image description here

docRoot - этоСтрока JSON, которая НЕ содержит объект equipmentId, поэтому цель состоит в том, чтобы добавить equipmentId к строке JSON и установить значение, равное _eqp["_id"]. Но, по-видимому, кажется, что тип объекта не является правильным или не распознается как JSON? Или я должен преобразовать _eqp["_id"] в какой-то объект JSON? Вот где я запутался.

Я получаю _eqp["id"] из коллекции в Mongo DB, где она хранится в виде данных JSON, поэтому неясно, почему это значение не установлено в docRoot.equipmentId.

Ниже представлен JSON от MongoDB

{{ "_id" : "81bd9b23-bed7-40f2-83f6-a151c0fd8877", "Name" : "Controller - 391000032", "ParentID" : "e1", "KeyId" : "391000032", "Make" : "", "Model" : "", "ProductType" : "Spotlight_Comp", "Type" : "Controller", "CustomerID" : "b11066e3-d5ab-45e1-a5e8-fe7e0268fc70", "IsActive" : true, "CreatedBy" : "u1", "UpdatedBy" : "u1", "UpdatedOn" : ISODate("2019-09-01T22:22:02.104Z"), "CreatedOn" : ISODate("2018-12-06T17:13:29.358Z"), "ThingNo" : "D-1525887284250-dV2kWoLYDU" }}

1 Ответ

1 голос
/ 17 октября 2019

Всякий раз, когда вы звоните _equips.Find(...) и в вашей базе данных есть соответствующий документ, вы получаете экземпляр BsonDocument , специальный тип, представленный драйвером MongoDB .NET. Этот специальный класс представляет свои собственные оболочки типа .NET. Вместо string вы получите BsonString, вместо int у нас будет BsonInt32 и так далее. Очевидно, что вы можете конвертировать их в типы .NET, но когда вы запрашиваете данные, вы получаете типы Bson в качестве полей документа.

Вы не упомянули, как создается docRoot, но на основании вашего изображения похоже, что вы используете библиотеку Json.NET . Говоря «docRoot - это строка JSON, которая НЕ содержит объект equipmentId», вы, вероятно, подразумеваете, что docRoot - это dynamic .NET-объект, созданный более или менее, как показано ниже:

dynamic docRoot = JsonConvert.DeserializeObject<dynamic>("{}");

Так как вы 'перестраивая JSON, вы должны иметь возможность использовать только типы, которые могут быть преобразованы в типы JSON. Подробнее здесь . За кадром ваш docRoot имеет тип DynamicProxyMetaObject, и всякий раз, когда вы пытаетесь присвоить какое-либо значение, он запускает этот метод.

Чтобы исправить это, вам необходимо преобразовать значение из BsonString в обычное .NET string, что можно сделать одним из двух способов, показанных ниже:

docRoot.equipmentId = _eqp["id"].ToString();
docRoot.equipmentId = _eqp["id"].AsString;
...