为了避免与键名冲突,可以使用JSON指针规范创建它们。
Jackson库也支持它,因此您以后可以使用它们遍历该
JsonNode节点。
简单的实现可能如下所示:
import com.fasterxml.jackson.databind.JsonNode;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.node.ArrayNode;import com.fasterxml.jackson.databind.node.ObjectNode;import java.io.File;import java.util.linkedHashMap;import java.util.Map;import java.util.Objects;import java.util.concurrent.atomic.AtomicInteger;public class JsonApp { public static void main(String[] args) throws Exception { File jsonFile = new File("./test.json"); ObjectMapper mapper = new ObjectMapper(); JsonNode root = mapper.readTree(jsonFile); Map<String, JsonNode> map = new JsonFlattener(root).flatten(); System.out.println("Use key-value pairs:"); map.forEach( (k, v) -> { System.out.println(k + " => " + v); }); System.out.println(); System.out.println("Use pointers:"); map.forEach( (k, v) -> { System.out.println(k + " => " + root.at(k)); }); }}class JsonFlattener { private final Map<String, JsonNode> json = new linkedHashMap<>(64); private final JsonNode root; JsonFlattener(JsonNode node) { this.root = Objects.requireNonNull(node); } public Map<String, JsonNode> flatten() { process(root, ""); return json; } private void process(JsonNode node, String prefix) { if (node.isObject()) { ObjectNode object = (ObjectNode) node; object .fields() .forEachRemaining( entry -> { process(entry.getValue(), prefix + "/" + entry.getKey()); }); } else if (node.isArray()) { ArrayNode array = (ArrayNode) node; AtomicInteger counter = new AtomicInteger(); array .elements() .forEachRemaining( item -> { process(item, prefix + "/" + counter.getAndIncrement()); }); } else { json.put(prefix, node); } }}上面的代码打印:
Use key-value pairs:/Source => "source-1"/Rows/0/Keys/device-id => "BC04-EBH-N3K-01"/Rows/0/Keys/interface-name => "TenGigE0/0/0/39"/Rows/0/Keys/node-name => "0/0/CPU0"/Rows/0/Timestamp => 1567621527656/Rows/0/inner/donm/id => "0062"/Rows/0/inner/donm/mol/rem => 30/Rows/0/inner/donm/mol/len => 11/Rows/0/inner/donm/mol/org/ldp/0/t => 486/Rows/0/inner/donm/mol/org/ldp/0/o => 322/Rows/0/inner/donm/mol/org/ldp/1/t => 487/Rows/0/inner/donm/mol/org/ldp/1/o => 32/Rows/0/inner/donm/mol/org/ldp/1/twss => 1/Rows/0/inner/donm/mol/org/ldp/1/tlv => "00:01"/Rows/0/inner/donm/mol/chlen => 14/Rows/0/inner/donm/mol/poe => 5/Rows/0/inner/donm/mol/combs => 10/Rows/0/inner/donm/mol/chaype => 4/Rows/0/inner/donm/mol/rek => 0/Rows/0/inner/donm/mol/rem-um => 67/Rows/0/inner/donm/detail/enas => "B,R"/Rows/0/inner/donm/detail/systes => "B,R"/Rows/0/inner/donm/detail/timng => 91/Rows/0/inner/donm/detail/syn => "C"/Rows/0/inner/donm/detail/met-type => 0/Rows/0/inner/donm/detail/neses/lldEDIT/0/ium => 830/Rows/0/inner/donm/detail/neses/lldEDIT/0/m => 1/Rows/0/inner/donm/detail/neses/lldEDIT/0/ass/ape => "ipv4"/Rows/0/inner/donm/detail/neses/lldEDIT/0/ass/ipvs => "94"/Rows/0/inner/donm/detail/pess => "0008"/Rows/0/inner/donm/detail/por]d => 0/Rows/0/inner/donm/detail/pon => "BCtive"/Rows/0/inner/donm/detail/sysme => "BC1"/Rows/0/inner/donm/reme => "Bu1"/Rows/0/inner/donm/hean => 0/Rows/0/inner/donm/porl => "Et1"/Tey/epath => "Cgetail"/Tey/sustr => "MX"/Tey/coime => 1567621527653/Tey/msp => 1567621527653/Tey/come => 1567621527660/Tey/nor => "BC5"/Tey/cid => 14789654Use pointers:/Source => "source-1"/Rows/0/Keys/device-id => "BC04-EBH-N3K-01"/Rows/0/Keys/interface-name => "TenGigE0/0/0/39"/Rows/0/Keys/node-name => "0/0/CPU0"/Rows/0/Timestamp => 1567621527656/Rows/0/inner/donm/id => "0062"/Rows/0/inner/donm/mol/rem => 30/Rows/0/inner/donm/mol/len => 11/Rows/0/inner/donm/mol/org/ldp/0/t => 486/Rows/0/inner/donm/mol/org/ldp/0/o => 322/Rows/0/inner/donm/mol/org/ldp/1/t => 487/Rows/0/inner/donm/mol/org/ldp/1/o => 32/Rows/0/inner/donm/mol/org/ldp/1/twss => 1/Rows/0/inner/donm/mol/org/ldp/1/tlv => "00:01"/Rows/0/inner/donm/mol/chlen => 14/Rows/0/inner/donm/mol/poe => 5/Rows/0/inner/donm/mol/combs => 10/Rows/0/inner/donm/mol/chaype => 4/Rows/0/inner/donm/mol/rek => 0/Rows/0/inner/donm/mol/rem-um => 67/Rows/0/inner/donm/detail/enas => "B,R"/Rows/0/inner/donm/detail/systes => "B,R"/Rows/0/inner/donm/detail/timng => 91/Rows/0/inner/donm/detail/syn => "C"/Rows/0/inner/donm/detail/met-type => 0/Rows/0/inner/donm/detail/neses/lldEDIT/0/ium => 830/Rows/0/inner/donm/detail/neses/lldEDIT/0/m => 1/Rows/0/inner/donm/detail/neses/lldEDIT/0/ass/ape => "ipv4"/Rows/0/inner/donm/detail/neses/lldEDIT/0/ass/ipvs => "94"/Rows/0/inner/donm/detail/pess => "0008"/Rows/0/inner/donm/detail/por]d => 0/Rows/0/inner/donm/detail/pon => "BCtive"/Rows/0/inner/donm/detail/sysme => "BC1"/Rows/0/inner/donm/reme => "Bu1"/Rows/0/inner/donm/hean => 0/Rows/0/inner/donm/porl => "Et1"/Tey/epath => "Cgetail"/Tey/sustr => "MX"/Tey/coime => 1567621527653/Tey/msp => 1567621527653/Tey/come => 1567621527660/Tey/nor => "BC5"/Tey/cid => 14789654



