2014-02-12 188 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 actions'是什麼意思。您可以將輸入String解析爲JsonObject s,但由於您仍然必須拆分字段名稱,因此您可能只需解析原始的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"}}}   
+0

非常感謝你 – user1365697