我想将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>
?
答案 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);