Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建json对象?_Java - Fatal编程技术网

Java 如何创建json对象?

Java 如何创建json对象?,java,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"}}} 没有字符串操作我怎么做?我不知道你所说的“字符串操作”是什么意思。您可以将输入的字符串解析为JsonObjects,但是您仍然需要拆分字段名,因此您也可以只解析原始的字符串 我是这

我有绳子

 {"comp1.a":1,comp1.b":"2","comp1.c.aa":3,"comp1.c.bb":"4"}
字段的名称将始终与“.”一起,如果有另一个级别,则与另一个级别一起

我希望输入的结果是:

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

没有字符串操作我怎么做?

我不知道你所说的“字符串操作”是什么意思。您可以将输入的
字符串
解析为
JsonObject
s,但是您仍然需要拆分字段名,因此您也可以只解析原始的
字符串

我是这样做的:

首先,我删除了
{
}
并基于
进行拆分:

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(), "}");
}
显然,您可以使用您选择的JavaJSONAPI来替代此代码中的
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"}}}        

这将需要一些自定义解析-您尝试过什么吗?展示您在解析这个方面所做的尝试。您真的必须用Java解析它吗?在JavaScript中,它会简单得多。我在java中需要它,这不是家庭作业。我不知道是从字符串拆分开始,还是有一种通用的方法来完成它。有一些库,比如Gson,可以将json字符串转换为java对象,但我想它们可能有这个命名约定的问题,你可以试试看。你能给我举个例子吗?