Не знаете, что вы подразумеваете под «строковыми действиями». Вы можете разобрать вход 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(), "}");
}
Вы могли бы, очевидно, заменить использование StringBuilder
в этом коде с Java JSON API по вашему выбору, синтаксический разбор метод уже сделал тяжелую работу.
Собираем все вместе, как это:
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"}}}
Это потребовало бы некоторые пользовательские синтаксический - вы пробовали что-нибудь? Покажите, какую попытку вы проанализировали. –
Это домашнее задание? –
Вам действительно нужно разбирать его на Java? В JavaScript это было бы намного проще. – user1983983