如何创建json对象?

时间:2014-02-12 13:56:02

标签: java

我有字符串

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

该字段的名称将始终为'。'如果有另一个级别,它将与另一个级别'。'

我希望输入结果为:

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

如果没有字符串操作,我该怎么做?

1 个答案:

答案 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"}}}