gpt4 book ai didi

java - 从LinkedHashMap检索值

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:40 31 4
gpt4 key购买 nike

我有一个看起来像这样的对象:

{
/test1: {
get: {
tags: [
"restcalls"
]
}
},
/test2: {
put: {
tags: [
"restcalls"
]
}
}
}

我正在检索上面的对象是这样的:
HashMap<?, ?> json = new ObjectMapper().readValue(str, HashMap.class);

但是,检索 tags并将其替换为其他关键字的最佳方法就是 "my rest calls"。请注意,get,put也可以是任何其他变量名,因此它的动态但标记始终位于get,put下。

最佳答案

您已经选择Jackson作为Java-JSON库(我可以说是一个不错的选择),所以您面临的问题是如何使用Jackson来以最佳方式遍历和更新JSON,但是那些甚至在决定使用哪种Java的人使用的-JSON库可以读取here,它与下面提到的7个Java-JSON库进行比较。以下是链接的摘要摘录:

结论是,如果您知道仅使用
您的应用程序中的数据量
,并且您希望将其存储或读取到
从JSON格式开始,您应该考虑使用Flexjson或Gson 。如果
您将使用大量数据,并希望存储或读取
与JSON格式之间的对接,您应该考虑使用Jackson或
JSON库

  • jackson
  • Google-GSON
  • JSON-lib
  • Flexjson
  • json-io
  • genson
  • JSONiJ


  • jackson

    要理解的最重要的事情是,Jackson提供了三种处理JSON的替代方法(请阅读更多 here),因此应根据具体要求明智地选择适当的方法。
  • 流API(又名“增量解析/生成”):它作为离散事件读取和写入JSON内容。 最佳使用情况:遍历事件(或 token )流。 类似于: SAX和Stax
  • 树模型:它提供JSON文档的可变内存中树表示形式。树模型类似于XML DOM。 最佳用法:将Json数据绑定到Java对象中。 类似于: JAXB
  • 数据绑定:它基于属性访问器约定或注释在POJO之间来回转换JSON。有两种变体:简单数据绑定和完整数据绑定。 最佳用例:(从Json)构建树结构并使用适当的方法遍历它。 类似于: DOM
  • 简单的数据绑定意味着与Java Maps,列表,字符串,数字,布尔值和null进行相互转换
  • 完全数据绑定意味着在任何Java bean类型(以及上述“简单”类型)之间进行转换。

  • 通常,从“性能角度”考虑使用“树模型”方法是最好的方法,因为它具有遍历树的优点。

    其他选项也有其自身的优势,例如 Streaming API具有较少的内存和CPU开销,而 数据绑定更易于使用,因为它提供JSON数据的 ListMap表示形式。但是,由于拥有如此强大的处理能力和内存,如今真正重要的是性能。

    如果您的JSON数据很大,然后以树表示形式对其进行分析,则树是宽还是长。如果宽度更宽,那么绝对可以使用“树模型”来获得与树处理相关的性能优势(确保一次映射的是大块而不是全部内容)。但是,如果树较长,意味着宽度不佳,而是一条长长的尾巴,那么请考虑使用“流API”,因为在这种情况下,树处理的优势无法得到体现。如果数据很小,则几乎没有关系,您可以默认使用“树模型”。

    当前您正在使用“数据绑定”方法,但建议您使用“树模型” ,因为您需要的只是遍历和操作JSON。查看您提供的信息,您似乎不需要将JSON转换为Java对象,因此“数据绑定”方法似乎是个坏主意。

    jackson 树模型

    jackson 的 com.fasterxml.jackson.databind.JsonNode 构成了 jackson 树模型的基础。 将Jackson的Tree模型视为HTML文档的DOM,则认为DOM以树结构表示完整的HTML文档,而Jackson的Tree模型则以树结构表示完整的JSON字符串。

    下面的代码将帮助您使用Jackson的Tree模型并实现所需的代码:
    import java.io.IOException;
    import java.util.Iterator;

    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.node.ObjectNode;


    public class Test {

    public static void main(String[] args) throws JsonProcessingException, IOException {
    String jsonString = "{\"test1\": {\"get\": {\"tags\": [\"restcalls1\"]}}, \"test2\": {\"put\": {\"tags\": [\"restcalls2\"] }}}";
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode rootNode = objectMapper.readTree(jsonString);

    Iterator<JsonNode> iterator2 = rootNode.iterator();
    while (iterator2.hasNext()) {
    JsonNode node2 = iterator2.next().findParent("tags");
    ObjectNode objectNode = (ObjectNode) node2;
    objectNode.putArray("tags").add("my rest calls");
    }

    Iterator<JsonNode> iterator = rootNode.iterator();
    while (iterator.hasNext()) {
    JsonNode node2 = iterator.next();
    System.out.println(node2);
    }

    }
    }

    树模型的优点:有关详细信息,请阅读 here
  • 如果Json内容的结构高度不规则,则可能很难(或不可能)找到或创建等效的Java对象结构。树模型可能是唯一的实际选择。
  • 用于显示任何JSON内容。 树模型是内部访问和操作的自然选择。
  • 由于不需要绑定特定的Java对象,因此可以编写更少的代码。

  • 延伸阅读:
  • There are Three -- and Only Three -- Ways to Process Json
  • Traversing JSON trees with Jackson
  • Json processing with Jackson

  • 基于OP的评论:

    下面的代码显示了如何遍历和打印整个JSON。这样,您可以遍历整个JSON,然后访问所需的元素。需要重点注意的一点是,即使您使用Stream API方法,也需要知道元素名称,也应该知道要查找的元素名称,请参见Stream API示例 here

    在任何情况下,您始终可以选择遍历整个JSON(如下面的示例所示)或进行特定的直接操作(如上面的示例所示)
    package com.him.services;

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Iterator;

    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;


    public class Test {

    public static void main(String[] args) throws JsonProcessingException, IOException {
    jacksonTest();
    }

    private static void jacksonTest() throws JsonProcessingException, IOException {
    String jsonString = "{\"test1\": {\"get\": {\"tags\": [\"restcalls1\"]}}, \"test2\": {\"put\": {\"tags\": [\"restcalls2\"] }}}";
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode rootNode = objectMapper.readTree(jsonString);
    ArrayList<JsonNode> nodeList = new ArrayList<JsonNode>();
    nodeList.add(rootNode);

    printCompleteJson(nodeList);
    }

    private static void printCompleteJson(ArrayList<JsonNode> rootNode) throws IOException {
    for (int i = 0; i < rootNode.size(); i++) {
    Iterator<JsonNode> iterator = rootNode.get(i).iterator();
    JsonNode node = null;
    ArrayList<JsonNode> nodeList = new ArrayList<JsonNode>();
    boolean isEmpty = true;
    while (iterator.hasNext()) {
    isEmpty = false;
    node = iterator.next();
    nodeList.add(node);
    System.out.println(node);
    }
    if(isEmpty){
    return;
    }
    printCompleteJson(nodeList);
    }
    }
    }

    关于java - 从LinkedHashMap检索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34077663/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com