将Json解析为DBObject

5

我有一个消费“test/plain”的REST服务,基本上我收到的字符串是一个JSON字符串,我有以下代码来解析JSON字符串到DBObject,以便我可以保存到MongoDB

@Timed
@POST
@Consumes("text/plain")
@Produces(MediaType.APPLICATION_JSON)
public Response insertscreenview(String message) {
    // System.out.println(message);
    final Logger logger = LoggerFactory.getLogger(ScreenviewResource.class);
    logger.info("Screenview Insert Request Recieved" + "\n" + message);
    screenviewInstance = new Screenview();
    tracInfoInstance = new TracInfo();
    BasicDBObject ageRangeId;
    GeoCheckManager geoCheckInstance = new GeoCheckManager();
    boolean brCheck;        
    try {
        ObjectMapper mapper = new ObjectMapper();
        JsonNode actualObj = mapper.readTree(message);

        System.out.println(message);

        DBObject objInstance = (DBObject)JSON.parse(message);
 ...}

我的JSON字符串如下所示

{
"Screenview": {
    "TracInfo": null,
    "Id": 0,
    "ScreenName": "SettingsActivity",
    "Timestamp": "2014-07-02T18:50:10",
    "Timezone": "Asia/Kolkata",
    "ApplicationId": null,
    "DeviceId": null,
    "UserId": null,
    "SessionId": "5684ae84-9a48-49a5-ab47-fcb7de3c08cf"
},
"Session": {
    "Id": "5684ae84-9a48-49a5-ab47-fcb7de3c08cf",
    "StartTime": "2014-07-02T13:20:58",
    "EndTime": "2014-07-02T13:21:09",
    "EntryScreen": "AccessPointActivity",
    "ExitScreen": "SettingsActivity",
    "FirstEvent": "SCREEN STARTED",
    "LastEvent": "SCREEN STOPPED",
    "ApplicationId": "fa41f204bfc711e3b9f9c8cbb8c502c4",
    "DeviceId": "0_6e505bcbe7e511e393b60aba4a7caa0b",
    "UserId": "",
    "TracInfoId": -1,
    "SensorsInfo": null
},
"CustomParams": {
    "Latitude": 0,
    "Longitude": 0,
    "Country": null,
    "CountryCode": null,
    "Region": null,
    "RegionCode": null,
    "City": null,
    "Gender": null,
    "Age": 0,
    "Platform": "Android",
    "OSVersion": "16",
    "Manufacturer": "samsung",
    "Resolution": "600 * 976",
    "NetworkCarrier": null,
    "Timezone": null
} }

我遇到了以下错误,但无法找到原因:

java.lang.ClassCastException: java.util.HashMap 无法转换为 com.mongodb.DBObject


首先,如果您的输入是JSON格式,应该使用“application/json”进行消费。人们在REST中经常犯错误,没有考虑MIME类型。但是,即使JSON是您唯一接受的输入,至少要做到这一点。附言:我们需要代码或正在执行解析的部分的参考。一个好的实现将会因为我刚才说的原因而失败。 - Neil Lunn
@NeilLunn 我已经添加了代码。 - Ninad
1
猜测这不是 com.mongodb.util 实现的 JSON.parse,请确保你正在导入正确的内容。 - Neil Lunn
以为可能是这样。在IDE中,我也曾经几次误按了类似的东西。 - Neil Lunn
2个回答

3

可以使用BasicDBObject代替DBObjectBasicDBObject有一个以Map为输入的构造函数:

BasicDBObject obj= new BasicDBObject(JSON.parse(message));

或者使用ObjectMapper:

BasicDBObject obj = mapper.readValue(message, BasicDBObject.class);


1
com.mongodb.util.JSON.parse(String) 返回的是一个对象,而不是一个映射。如果它不是一个装箱的原始值,你可以安全地将其转换为 DBObject。 - A. Rodas

2

将字符串解析为DBObject的更现代方法:

BasicDBObject dbObject = com.mongodb.BasicDBObject.parse(rawJsonString)

请注意,这可能仅适用于自由模式的json对象,大多数情况下,可以使用类似Springs MongoDBTemplate/MongoRepository等工具来处理映射。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接