栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将JSON反序列化为扁平的类似Map的结构?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将JSON反序列化为扁平的类似Map的结构?

您可以执行以下操作遍历树并跟踪找出点表示法属性名称的深度:

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 com.fasterxml.jackson.databind.node.ValueNode;import java.io.IOException;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import org.junit.Test;public class FlattenJson {  String json = "{n" +      "   "Port":n" +      "   {n" +      "       "@alias": "defaultHttp",n" +      "       "Enabled": "true",n" +      "       "Number": "10092",n" +      "       "Protocol": "http",n" +      "       "KeepAliveTimeout": "20000",n" +      "       "ThreadPool":n" +      "       {n" +      ""@enabled": "false",n" +      ""Max": "150",n" +      ""ThreadPriority": "5"n" +      "       },n" +      "       "ExtendedProperties":n" +      "       {n" +      ""Property":n" +      "[   n" +      "    {n" +      "        "@name": "connectionTimeout",n" +      "        "$": "20000"n" +      "    }n" +      "]n" +      "       }n" +      "   }n" +      "}";  @Test  public void testCreatingKeyValues() {    Map<String, String> map = new HashMap<String, String>();    try {      addKeys("", new ObjectMapper().readTree(json), map);    } catch (IOException e) {      e.printStackTrace();    }    System.out.println(map);  }  private void addKeys(String currentPath, JsonNode jsonNode, Map<String, String> map) {    if (jsonNode.isObject()) {      ObjectNode objectNode = (ObjectNode) jsonNode;      Iterator<Map.Entry<String, JsonNode>> iter = objectNode.fields();      String pathPrefix = currentPath.isEmpty() ? "" : currentPath + ".";      while (iter.hasNext()) {        Map.Entry<String, JsonNode> entry = iter.next();        addKeys(pathPrefix + entry.getKey(), entry.getValue(), map);      }    } else if (jsonNode.isArray()) {      ArrayNode arrayNode = (ArrayNode) jsonNode;      for (int i = 0; i < arrayNode.size(); i++) {        addKeys(currentPath + "[" + i + "]", arrayNode.get(i), map);      }    } else if (jsonNode.isValueNode()) {      ValueNode valueNode = (ValueNode) jsonNode;      map.put(currentPath, valueNode.asText());    }  }}

它产生以下图:

Port.ThreadPool.Max=150, Port.ThreadPool.@enabled=false, Port.Number=10092, Port.ExtendedProperties.Property[0].@name=connectionTimeout, Port.ThreadPool.ThreadPriority=5, Port.Protocol=http, Port.KeepAliveTimeout=20000, Port.ExtendedProperties.Property[0].$=20000, Port.@alias=defaultHttp, Port.Enabled=true

尽管您说JSON是任意的,但最终可能会导致键名冲突,因此剥离

@
$
属性名应该足够容易。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/616786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号