Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson将值读取为字符串_Java_Json_Jackson - Fatal编程技术网

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>>() {});

通过阅读教程页面,最终找到了解决方案

在这里给其他人一个提示:

  • 创建解析器时切换到使用MappingJSONFactory:

        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();