使用ObjectId函数将JSON反序列化为Map <string,object =“”>

时间:2017-08-09 14:23:57

标签: java json jackson

我想将json字符串解析为Map<String, Object>

我的代码是:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
.......
    ObjectMapper mapper = new ObjectMapper();
            try {
                TypeReference ref = new TypeReference<Map<String, Object>>() { };
                this.map = mapper.readValue(jsonString, ref);
            } catch (IOException e) {
                LOG.error("cannot create Map from json", e);
            }

json的例子是:

 {
    "_id" : ObjectId("595cc3e6cbaa230d3c764649"),
    "type" : "msg",
    "quantity" : 472,
    "price" : 15.04
}

但结果是:

cannot create Map from json
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'ObjectId': was expecting ('true', 'false' or 'null')
 at [Source: {
  "_id" : ObjectId("598ac67fcbaa23254498df87"),

我有很多带有ObjectId的json字符串。我不想改变文字。

我不知道所有字段的名称,所以我需要Map。我无法使用POJO对象。

如何使用ObjectId funstion将json解析为Map<String, Object>

4 个答案:

答案 0 :(得分:0)

导致此错误的原因是_id值不符合JSON标准(请参阅JSON.org)。 JSON值只能是:数字,字符串,数组,对象(以&#39; {&#39;以及&#39;}&#39;开头),&#39; true&#39; ;,&#39; false&#39;或者&#39; null&#39;。有关更多信息,请参阅JSON.org。您的JSON似乎是BSON(https://docs.mongodb.com/manual/reference/bson-types/)。

修改

一个相当hacky的解决方案,但也许只是替换那些对JSON无效的BSON部分适用于你?:

String jsonString = "{
                      \"_id\" : ObjectId(\"595cc3e6cbaa230d3c764649\"),
                      \"type\" : \"msg\",
                      \"quantity\" : 472,
                      \"price\" : 15.04
                      }";

jsonString.replace("ObjectId(","").replace(")","")

当然,你必须更换所有无效的条目。

答案 1 :(得分:0)

之所以如此,是因为JSON无法按JSON Syntax.

生效
{
"_id" : ObjectId("595cc3e6cbaa230d3c764649"),
"type" : "msg",
"quantity" : 472,
"price" : 15.04
}

不是有效的JSON

Error: Parse error on line 2:
{   "_id": ObjectId("595cc3e6cb
 -----------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined'

here验证您的JSON

答案 2 :(得分:0)

我找到了解决方案。我使用org.bson.Document。

import org.bson.Document;
.........
Document doc = Document.parse(jsonString);
return new HashMap<>(doc);

最后一个问题:为什么杰克逊无法解析为bson Document?

答案 3 :(得分:0)

您可以执行的操作是从json中删除{“ _id”:ObjectId(“ 595cc3e6cbaa230d3c764649”)},如果它并不重要,请执行您的操作。

Document  doc = (Document) DataDao.findOne("Id");

doc.remove("_id");
final JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.SHELL).build();
String json = doc.toJson(settings);
XyzData xyzData = jsonHelper.fromJson(json, XyzData.class);