我有字符串
{"comp1.a":1,comp1.b":"2","comp1.c.aa":3,"comp1.c.bb":"4"}
该字段的名称将始终为'。'如果有另一个级别,它将与另一个级别'。'
我希望输入结果为:
{"comp1":{"a":1,"b":"2","c":{"aa":3,"bb":"4"}}}
如果没有字符串操作,我该怎么做?
答案 0 :(得分:1)
不知道'字符串动作'是什么意思。您可以将输入String
解析为JsonObject
,但由于您仍需要拆分字段名称,因此您也可以解析原始String
。
我是这样做的:
首先,我删除了{
和}
并根据,
拆分:
String[] tokens = "{\"comp1.a\":1,comp1.b\":\"2\",\"comp1.c.aa\":3,\"comp1.c.bb\":\"4\"}".replaceAll("\\{|\\}", "").split(",");
然后我编写了一个递归解析方法,它使用java.util.Map
获取每个标记并构建图形:
private void parse(Map graph, String token)
{
int index = token.indexOf(".");
if (index > -1)
{
String name = token.substring(0, index).replaceAll("\"", "");
String remainder = token.substring(index + 1, token.length());
Map children = (Map)graph.get(name);
if (children == null)
{
children = new HashMap();
graph.put(name, children);
}
parse(children, remainder);
}
else
{
String[] nameValuePair = token.split(":");
graph.put(nameValuePair[0].replaceAll("\"", ""), nameValuePair[1]);
}
}
如果此方法在令牌中找到.
,则会在图表中创建另一个级别并进行递归,否则只会将该值添加到图表中。
接下来,我写了一个方法,将该图形转换回有效的JSON字符串:
private void toJson(StringBuilder jsonBuilder, Map graph)
{
jsonBuilder.append("{");
for (Object key : graph.keySet())
{
jsonBuilder.append("\"").append(key).append("\"");
Object value = graph.get(key);
if (value instanceof Map)
{
toJson(jsonBuilder.append(":"), (Map)value);
jsonBuilder.append("}");
}
else
{
jsonBuilder.append(":").append(value).append(",");
}
}
jsonBuilder.replace(jsonBuilder.length() - 1, jsonBuilder.length(), "}");
}
显然,您可以使用您选择的Java JSON API替换此代码中StringBuilder
的使用,解析方法已经做了很多工作。
像这样把所有这些放在一起:
String[] tokens = "{\"comp1.a\":1,comp1.b\":\"2\",\"comp1.c.aa\":3,\"comp1.c.bb\":\"4\"}".replaceAll("\\{|\\}", "").split(",");
Map graph = new HashMap();
for (String token : tokens)
{
parse(graph, token);
}
StringBuilder jsonBuilder = new StringBuilder();
toJson(jsonBuilder, graph);
System.out.println(jsonBuilder.toString());
我得到了输出:
{"comp1":{"a":1,"b":"2","c":{"aa":3,"bb":"4"}}}