无法确定 JSON 对象类型系统参数异常
Could not determine JSON object type System Argument Exception
我想获得一些帮助,解决我在尝试将值设置为 JSON 对象时遇到的以下异常。
docRoot
是一个 JSON 字符串,它不包含 equipmentId
对象,因此目标是将 equipmentId
添加到 JSON 字符串并且将值设置为 _eqp["_id"]
。但显然对象类型似乎不正确或未被识别为 JSON?或者我必须将 _eqp["_id"]
转换为某种 JSON 对象?这就是我困惑的地方。
我从 Mongo 数据库中的一个集合中获取 _eqp["id"]
,它存储为 JSON 数据,所以不清楚为什么这个值没有被设置为 docRoot.equipmentId
.
下面是来自 MongoDB
的 JSON
{{ "_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" }}
每当您调用 _equips.Find(...)
并且您的数据库中有一个匹配文档时,您将获得 BsonDocument 的实例,这是 MongoDB .NET 驱动程序引入的特殊类型。这个特殊的 class 介绍了它自己的 .NET 类型包装器。而不是 string
你会得到 BsonString
,而不是 int
我们有 BsonInt32
等等。您显然可以将它们转换为 .NET 类型,但是当您查询数据时,您会将 Bson 类型作为文档的字段。
您没有提到 docRoot
是如何创建的,但根据您的图像,您似乎正在使用 Json.NET 库。通过说 "docRoot is a JSON string that DOES NOT contain an equipmentId object" 你可能意味着 docRoot
是一个 dynamic
.NET 对象创建或多或少像下面这样:
dynamic docRoot = JsonConvert.DeserializeObject<dynamic>("{}");
由于您正在构建 JSON
,因此您应该只能使用可转换为 JSON 类型的类型。更多详细信息 here. Behind the scenes your docRoot
is of type DynamicProxyMetaObject
and whenever you try to assign any value it runs this 方法。
要解决此问题,您需要将值从 BsonString
转换为常规 .NET string
,这可以使用以下两种方法之一完成:
docRoot.equipmentId = _eqp["id"].ToString();
docRoot.equipmentId = _eqp["id"].AsString;
我想获得一些帮助,解决我在尝试将值设置为 JSON 对象时遇到的以下异常。
docRoot
是一个 JSON 字符串,它不包含 equipmentId
对象,因此目标是将 equipmentId
添加到 JSON 字符串并且将值设置为 _eqp["_id"]
。但显然对象类型似乎不正确或未被识别为 JSON?或者我必须将 _eqp["_id"]
转换为某种 JSON 对象?这就是我困惑的地方。
我从 Mongo 数据库中的一个集合中获取 _eqp["id"]
,它存储为 JSON 数据,所以不清楚为什么这个值没有被设置为 docRoot.equipmentId
.
下面是来自 MongoDB
的 JSON{{ "_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" }}
每当您调用 _equips.Find(...)
并且您的数据库中有一个匹配文档时,您将获得 BsonDocument 的实例,这是 MongoDB .NET 驱动程序引入的特殊类型。这个特殊的 class 介绍了它自己的 .NET 类型包装器。而不是 string
你会得到 BsonString
,而不是 int
我们有 BsonInt32
等等。您显然可以将它们转换为 .NET 类型,但是当您查询数据时,您会将 Bson 类型作为文档的字段。
您没有提到 docRoot
是如何创建的,但根据您的图像,您似乎正在使用 Json.NET 库。通过说 "docRoot is a JSON string that DOES NOT contain an equipmentId object" 你可能意味着 docRoot
是一个 dynamic
.NET 对象创建或多或少像下面这样:
dynamic docRoot = JsonConvert.DeserializeObject<dynamic>("{}");
由于您正在构建 JSON
,因此您应该只能使用可转换为 JSON 类型的类型。更多详细信息 here. Behind the scenes your docRoot
is of type DynamicProxyMetaObject
and whenever you try to assign any value it runs this 方法。
要解决此问题,您需要将值从 BsonString
转换为常规 .NET string
,这可以使用以下两种方法之一完成:
docRoot.equipmentId = _eqp["id"].ToString();
docRoot.equipmentId = _eqp["id"].AsString;