我有串如何創建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"}}}
我怎樣可以不用串動作?
我有串如何創建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"}}}
我怎樣可以不用串動作?
不知道'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"}}}
非常感謝你 – user1365697
這將需要一些定製的解析 - 你試過什麼?顯示您爲解析此問題所做的嘗試。 –
這是功課嗎? –
你真的需要用Java解析嗎?在JavaScript中它會簡單得多。 – user1983983