2014-02-12 16 views
-1

У меня есть строкаКак создать объект json?

{"comp1.a":1,comp1.b":"2","comp1.c.aa":3,"comp1.c.bb":"4"} 

Имя поля всегда будет с «» и если есть другой уровень, это будет с другим ».

Я хочу, чтобы результат ввода будет:

{"comp1":{"a":1,"b":"2","c":{"aa":3,"bb":"4"}}} 

Как я могу сделать это без строковых действий?

+2

Это потребовало бы некоторые пользовательские синтаксический - вы пробовали что-нибудь? Покажите, какую попытку вы проанализировали. –

+0

Это домашнее задание? –

+0

Вам действительно нужно разбирать его на Java? В JavaScript это было бы намного проще. – user1983983

ответ

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(), "}"); 
} 

Вы могли бы, очевидно, заменить использование 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"}}}   
+0

спасибо вам большое – user1365697

Смежные вопросы