错误句柄:元素名称无效?

时间:2018-05-30 17:27:51

标签: c# json mongodb

我正在尝试在MongoDB中插入批量JSON字符串文档。但是有些文档就像JSON格式一样。

{
  "application.data":"process"
}

此问题显示错误消息:Element name "application.data" is not valid

当前代码库

var collectionData = dataBase.GetCollection<BsonDocument>("collectionName");
string json = "{ "application.data":"process" }";

var document = BsonSerializer.Deserialize<BsonDocument>(json);//here is throwing error

collectionData?.InsertOne(document);

2 个答案:

答案 0 :(得分:2)

namespace LTG_Entity
{
    public class DBItem
    {
        public string Nom { get; set; }
        public string Description { get; set; }
    }
}

不是有效的JSON字符串。第二个双引号是关闭字符串,并且没有跟进的连接运算符。如果你需要application.data和process的双引号(我猜你这么做),请使用反斜杠分隔符。

string json = "{ "application.data":"process" }";

答案 1 :(得分:2)

即使mongodb在数据库引擎和mongo shell中允许这样做:

> db.test.insert( { "text.this" : true } )
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("5b0f2095e1bd0eaac6294dcf"), "text.this" : true }
>

我强烈建议反对它,因为查询将是一场噩梦。

但是,如果您在C#中有一个JSON字符串,我会使用类似Json.NET的东西并将.拆分成嵌入式文档:

string json = "{ \"application.data\":\"process\" }";
var jObject = JsonConvert.DeserializeObject<JObject>(json);

var jWithDot = jObject.Properties().Where(x => x.Name.Contains(".")).ToList();
foreach (var j in jWithDot)
{
    var names = j.Name.Split(".");

    var jProperty = new JProperty(names[0], new JObject(new JProperty(names[1], j.Value)));
    j.Replace(jProperty);
}

// { "application": { "data": "process" } }
var newJson = jObject.ToString();

然后你可以像普通的那样在MongoDB中展示

var mongoClient = new MongoClient();
var mongoDatabase = mongoClient.GetDatabase("test");
var collection = mongoDatabase.GetCollection<BsonDocument>("test");

collection.InsertOne(BsonDocument.Parse(newJson));

执行后,您将在shell中看到以下内容:

> db.test.find()
{ "_id" : ObjectId("5b0f236605267300e0911e43"), "application" : { "data" : "process" } }