Java Jackson将值读取为字符串
比如说,我有一个值未知的对象Java Jackson将值读取为字符串,java,json,jackson,Java,Json,Jackson,比如说,我有一个值未知的对象 { "data": [ {"a":..., "dont_know_what_else_is_here":....} ] } 我只想将“data”的值作为字符串存储到变量/数据库中 我应该如何从流式API中读取它?如果您已经将此对象读入JsonNode,您可以这样做: String content = jsonNode.get("data").textValue(); UPD:因为您使用的是流式解析器,所以关于Jackson用法的示例可能会有所
{
"data": [
{"a":...,
"dont_know_what_else_is_here":....}
]
}
我只想将“data”的值作为字符串存储到变量/数据库中
我应该如何从流式API中读取它?如果您已经将此对象读入
JsonNode
,您可以这样做:
String content = jsonNode.get("data").textValue();
UPD:因为您使用的是流式解析器,所以关于Jackson用法的示例可能会有所帮助
UPD:方法名称现在是textValue()-您可以为JSON结果创建一些实体类
String json = "your_json";
ObjectMapper mapper = new ObjectMapper();
Entity entity = mapper .readValue(json, Entity.class);
// here you can do everything with entity as you wish
// to write Entity value as String when you wish
String text = mapper.writeValueAsString(object);
// to write Entity child's value as String when you wish (let's data contain data part)
String data = mapper.writeValueAsString(object.getData());
您可以根据键值对在映射中获取数据
Map<String, Object> mp = mapper.readValue(new File("xyz.txt"),new TypeReference<Map<String, Object>>() {});
通过阅读教程页面,最终找到了解决方案 在这里给其他人一个提示:
HttpResponse response = client.execute(request);
JsonFactory jfactory = new MappingJsonFactory();
JsonParser parser=jfactory.createJsonParser(response.getEntity().getContent());
parser.readValueAsTree().toString();
或者根据需要对其进行解析 我假设您只想使用流式API从输入中读取一个子树——但最终,您需要将整个子树作为一件事存储在DB(或变量)中 因此,您可能想要使用的是
JsonParser.readValueAs(MyType.class)
——这将调用ObjectMapper
(为了使它工作,必须通过JsonFactory
创建解析器,从ObjectMapper
访问;或者您需要调用JsonFactory.setCodec(mapper)
)
如果内容是任意的,您可以将其读取为Map
或JsonNode
:
Map<String,Object> map = parser.readValueAs(Map.class);
// or
JsonNode root = parser.readValueAsTree();
Map-Map=parser.readValueAs(Map.class);
//或
JsonNode root=parser.readValueAsTree();
只要
JsonParser
指向要数据绑定的JSON对象的START\u元素。如果在createParser(data)
中使用字符串数据,我就使用此方法通过流式api收集字符串内容:
if ("data".equals(fieldname))
String strData = getValueAsString(jp);
及
当数据源是字符串时,它工作。对于像file这样的无字符串源,使用JsonLocation.getByteOffset()
而不是JsonLocation.getCharOffset()
假设您有一个名为User()的POJO java类
}
现在有了JSON字符串,它来自任何地方,比如web套接字或其他地方
String json = "{\n" +
" \"name\" : { \"first\" : \"Joe\", \"last\" : \"Sixpack\" },\n" +
" \"gender\" : \"MALE\",\n" +
" \"verified\" : false,\n" +
" \"userImage\" : \"Rm9vYmFyIQ==\"\n" +
"}";
现在您可以使用这段代码将这个JSON字符串转换为POJO对象
ObjectMapper mapper = new ObjectMapper();
User user = mapper .readValue(json, User.class);
当我们试图从JsonNode获取字符串形式的数据时,我们通常使用asText,但我们应该使用textValue。
:如果节点是值节点,则返回容器值的有效字符串表示形式的方法(方法isValueNode()返回true),否则返回空字符串。
:用于访问字符串值的方法。不为非字符串值节点进行任何转换;对于非字符串值(ISTEXTAL()返回false的值),将返回null。对于字符串值,永远不会返回null(但可能会返回空字符串)
让我们举个例子
JsonNode getJsonData(){
ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("anyParameter",null);
return node;
}
JsonNode node = getJsonData();
json.get("anyParameter").asText() // this will give output as "null"
json.get("").textValue() // this will give output as null
假设您已经有了一个解析器,并且它指向“数据”令牌(例如来自自定义反序列化程序),您可以执行以下操作:
ObjectMapper mapper = new ObjectMapper();
JsonNode treeNode = mapper.readTree(parser);
return treeNode.toString();
这将得到包含“数据”值的字符串。感谢您的回答!这是来自流式解析器的,所以不幸的是,它还没有读入jsonNode。如果我能把它读到json节点,那么把整个对象串起来就行了。@Edison哦,我现在明白了。你们检查过这个例子吗?是的,我检查过,但我在数据数组中有未知的结构。有什么想法吗?我也编辑了这个问题。数据是一个包含混合对象的数组。@Joey Baruch asText()会将任何非文本转换为字符串值,而textValue()则用于如果您确定它是字符串。我使用的是流式解析器,所以我不想整体读取“数据”。@dejavu嗨,使用mapper从URL获取sting的最佳方法是什么?如何将jsonNode转换为字符串[]在java中?最后我检查了一下,一些toString方法只是用于调试,不能保证生成代表其内容的有效JSON。很高兴知道。它在一个非常复杂的物体上对我有效。不过,是时候仔细检查一下了……幸运的是“org.codehaus.jackson.map.MappingJsonFactory”确实正确地实现了toString:)@从现在开始。但是我在JavaDocs中没有看到保证在未来版本中继续工作的地方。@ProgrammerBruce你是对的,JsonNode.toString()
不是进行转换的正确方法,而是应该使用ObjectMapper.writeValueAsString(node)
。
ObjectMapper mapper = new ObjectMapper();
User user = mapper .readValue(json, User.class);
JsonNode getJsonData(){
ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("anyParameter",null);
return node;
}
JsonNode node = getJsonData();
json.get("anyParameter").asText() // this will give output as "null"
json.get("").textValue() // this will give output as null
ObjectMapper mapper = new ObjectMapper();
JsonNode treeNode = mapper.readTree(parser);
return treeNode.toString();