嵌套的JSON,根元素没有键,而且它是变化的

时间:2016-10-19 18:17:03

标签: json nested key gson

我有一个独特的要求,我需要构建一个JSON,如下所示。

{  
  "XXXMonitoring/DC/EVN/DBNAME":{  
    "t":123456777,
    "s":{  
      "CAPTURE":{  
        "c":100
      }
    }
  }
}

其中根元素" XXXMonitoring / DC / EVN / DBNAME"包含" /"在它之间,因为它代表了一条道路。我尝试使用GSON来嵌套java,但不确定我如何表示" XXXMonitoring / DC / EVN / DBNAME"来自我的Java对象。

有人可以帮我解决这个问题吗。

3 个答案:

答案 0 :(得分:0)

我不确定这是不是你要问的......

但sollidus(/)会被反斜杠(\)转义,以确保浏览器不会将其误认为是关闭脚本标记

当您需要使用该密钥时,可以使用String.replaceAll()方法删除反斜杠

json.toString()。replaceAll(" \\\\","");

答案 1 :(得分:0)

使用以下代码可以在没有POJO类的情况下构造JSON字符串。

如果JSON结构相同且只有键的值会发生变化,则可以使用变量替换硬编码值,并将其转换为实用程序方法。可以重用该实用程序方法来生成JSON字符串。

public static void main(String[] args) throws IOException {

        Gson gson = new Gson();

        JsonObject jsonRootObject = new JsonObject();
        JsonObject jsonFirstLevelObject = new JsonObject();

        // t property
        jsonFirstLevelObject.addProperty("t", 123456777);

        JsonObject jsonCaptureObject = new JsonObject();
        JsonObject jsonCObject = new JsonObject();
        jsonCObject.addProperty("c", 100);
        jsonCaptureObject.add("CAPTURE", jsonCObject);

        // s property
        jsonFirstLevelObject.add("s", jsonCaptureObject);

        jsonRootObject.add("XXXMonitoring/DC/EVN/DBNAME", jsonFirstLevelObject);

        System.out.println(gson.toJson(jsonRootObject));

    }

答案 2 :(得分:0)

我有一个名为GsonPath的库,可能符合您的需求。该库的目的是提供一个注释处理器,该处理器生成样板代码以帮助简化您需要编写的POJO。

通过使用库,您可以编写类似于以下内容的POJO:

@AutoGsonAdapter(rootField = "XXXMonitoring/DC/EVN/DBNAME")
public class SamplePojo {
    int t;

    @SerializedName("s.CAPTURE.c")
    int sCapture;
}

然后您在gson对象中需要做的就是注册一个特殊的TypeAdapterFactory

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapterFactory(GsonPath.createTypeAdapterFactory());
Gson gson = builder.create();

library中的文档非常全面,如果您有任何问题,请告诉我们!