【问题标题】:C# reading document from mongodb into JSON and trying to get values [duplicate]C#从mongodb读取文档到JSON并尝试获取值[重复]
【发布时间】:2014-10-15 18:12:15
【问题描述】:

我是 JSON 新手,所以这可能是一个简单的问题。我有下面的代码(带有一个 json 对象,同样在下面)。

我只想能够读取 JSON 并将其中的项目放入变量中以便读取。

我收到错误,这是由于 JSON 对象中的文本 ObjectID("") 返回: Unexpected character encountered while parsing value: O. Path '_id', line 1, position 10.

从 MONGO 返回的 JSON 对象:

{
    "_id": ObjectId("543c2d426b6b5ef78b62fc41"),
    "LoanStatusAddedEvent": {
        "@From": "Lakewood",
        "@MessageTimeDateStamp": "2013-08-12T05:03:23.035-04:00",
        "@MessageID": "29055040",
        "LoanNumber": "5300494930",
        "CurrentIndicator": "true",
        "StatusChangeDate": "2013-08-11T20:01:01.000",
        "StatusValue": "42",
        "StatusType": "Active"
    }
}

代码:

        // connect to the mongo server and the Mongos DB
        string connectionString = "connectionstringhere";


        MongoServer mongo = MongoServer.Create(connectionString);
        mongo.Connect();

        MongoDatabase database = mongo.GetDatabase("Mangos");


        //Builds new Collection (looking at JsonImports on server)
        MongoCollection<LoanStatus> collection2 = database.GetCollection<LoanStatus>("JsonImports");


        var collection = database.GetCollection<BsonDocument>("JsonImports");


        var query = new QueryDocument(); //("LoanNumber", "5300494930");


        foreach (BsonDocument item in collection.Find(query))
        {
            string json = item.ToJson();

            Console.WriteLine(item);


            // code here to below http://james.newtonking.com/json/help/index.html?topic=html/QueryingLINQtoJSON.htm
            JObject rss = JObject.Parse(json);

            string rssLoanNumber = (string)rss["LoanStatusAddedEvent"]["LoanNumber"];

            Console.WriteLine(rssLoanNumber);



        }// end for each loop


        Console.WriteLine();
        Console.Read();


public class LoanStatus
{
    public string From { get; set; }

    public string MessageTimeDateStamp { get; set; }

    public string MessageID { get; set; }

    public string LoanNumber { get; set; }

    public string CurrentIndicator { get; set; }

    public string StatusChangeDate { get; set; }

    public string StatusValue { get; set; }

    public string StatusType { get; set; }

    //public string id { get; set; }



    public void PrintDetailsToScreen()
    {
        Console.WriteLine(String.Format("{0}{1}{2}",
                            this.LoanNumber, this.StatusChangeDate, this.StatusValue));
    }

}

public class RootObject
{
    public LoanStatus LoanStatus { get; set; }
}

【问题讨论】:

    标签: c# json mongodb parsing


    【解决方案1】:

    您的对象应该有一个FieldProperty,名称为_idId,类型为ObjectId

    public ObjectId Id { get; set; }
    

    如果您可以重新构建您的 mongo 数据库,您可以将 Id 的类型更改为 String 而不是 ObjectId 并通过

    告诉 mongo 驱动程序将所有 id 视为字符串
    BsonSerializer.RegisterIdGenerator(typeof(string), new StringObjectIdGenerator());
    

    如果你这样做,你可以使用任何string 作为Id,如果它是空的,MongoDb 会为你的文档创建一个随机的Id

    • 更新:

    Mongodb 文档不是有效的 Json 文档。它有一些不会用 json.net 解析的值。 您应该手动删除它们。有一个简单的代码

    var json = "ObjectId(\"123\")";
    var result =  Regex.Match(json, @"ObjectId\(([^\)]*)\)").Value;
    var id = result.Replace("ObjectId(", string.Empty).Replace(")", String.Empty);
    var validJson = json.Replace(result, id);
    

    【讨论】:

    • 将记录插入数据库时​​会自动生成objectId。这是导入 Mongo 之前的 JSON:{"LoanStatusAddedEvent":{"@From":"Lakewood","@MessageTimeDateStamp":"2013-08-12T05:03:24.602-04:00","@MessageID": "29056324","LoanNumber":"4699880107","CurrentIndicator":"true","StatusChangeDate":"2013-08-12T00:36:23.000","StatusValue":"45","StatusType":"Active "}}
    • Mongo Json 不是 json.net 理解的标准 Json。 String Id 将解决问题,但可能不是您想要的方式。
    • 我不需要或关心 id 字段(至少在结果中)所以有没有办法忽略它并使其作为 JSON 对象工作?或者以其他方式从 MongoDB 中解析出 JSON 以外的记录。我不必使用 JSON 来解析它。
    • 您可以使用正则表达式手动将 ObjectID("...") 替换为 "..."。 var json = "ObjectId(\"123\")"; var 结果 = Regex.Match(json, @"ObjectId(([^)]*))").Value; var id = result.Replace("ObjectId(", string.Empty).Replace(")", String.Empty); var validJson = json.Replace(result, id);
    • 我正在考虑做类似的事情(替换功能),但我可能会返回数百个结果(虽然不是大部分时间)并且不确定性能影响,但我是只是要进行字符串替换,正则表达式会快得多。你知道上面的示例 JSON 假设有数百条记录会对性能造成什么样的影响(我知道考虑了很多其他因素,但只是一个大概)
    猜你喜欢
    • 2014-11-15
    • 2017-03-09
    • 2018-01-07
    • 2015-03-26
    • 1970-01-01
    • 2022-01-25
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多