【问题标题】:UNNEST JSON array to like SQL rowsUNNEST JSON 数组喜欢 SQL 行
【发布时间】:2021-12-06 11:13:50
【问题描述】:

我可以有这样的 JSON:

[
  { 
    "number": 123, 
    "items" : [
      {"product": "P1","cost":10.5},
      {"product": "P2","cost":5.25}
    ],
    "tags":["a","b","c"],
    "customer": {
      "name": "Roberto",
      "shortName": "Beto"
    },
    "actions": [{
      "moment": "2021-01-01 11:22:22.222",
      "description": "action 1"
    },{
      "moment": "2021-01-23 11:22:22.222",
      "description": "action 2"
    }]
  }
]

我需要使用joins 获得查询的 SQL 结果之类的输出。注意,输出必须根据复杂的关联进行协调(在上面的例子中,属性:项目和动作):

[
  { "number": 123, "items_product" : "P1", "items_cost": 10.5, "tags": null, "actions_moment": null, "actions_description": null}
  { "number": 123, "items_product" : "P2", "items_cost": 5.25, "tags": null, "actions_moment": null, "actions_description": null}
  { "number": 123, "items_product" : null, "items_cost": null, "tags": "a", "actions_moment": null, "actions_description": null}
  { "number": 123, "items_product" : null, "items_cost": null, "tags": "b", "actions_moment": null, "actions_description": null}
  { "number": 123, "items_product" : null, "items_cost": null, "tags": "c", "actions_moment": null, "actions_description": null}
  { "number": 123, "items_product" : null, "items_cost": null, "tags": null, "actions_moment": "2021-01-01 11:22:22.222", "actions_description": "Expedicao"}
  { "number": 123, "items_product" : null, "items_cost": null, "tags": null, "actions_moment": "2021-01-23 11:22:22.222", "actions_description": "Bla bla bla"}
]

我需要使用 Java 和 Google Gson 动态生成输出。

【问题讨论】:

标签: java json


【解决方案1】:

实现此目的的简单方法如下 2 个步骤所示:
第 1 步:为输出创建一个 POJO 类。

class Output {
    private int number;

    @SerializedName("items_product")
    private String itemsProduct;

    @SerializedName("items_cost")
    private float itemsCost ;

    private String tags;

    @SerializedName("actions_moment")
    private String actionsMoment;

    @SerializedName("actions_description")
    private String actionsDescription;

    public Output(int number) {
        this.number = number;
    }

    //general getters and setters
}

第 2 步:解析给定的 JSON 字符串并将其存储为预定义的 Output 类。

Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
JsonElement root = gson.fromJson(inputJsonStr, JsonElement.class);

List<Output> outputList = new ArrayList<>();
root.getAsJsonArray().forEach(e -> {
    JsonObject element = e.getAsJsonObject();
    int number = element.get("number").getAsInt()

    element.get("items").getAsJsonArray().forEach(i -> {
        Output output = new Output(number);
        output.setItemsProduct(i.getAsJsonObject().get("product").getAsString());
        output.setItemsCost(i.getAsJsonObject().get("cost").getAsFloat());
        outputList.add(output);
    })

    element.get("tags").getAsJsonArray().forEach(t -> {
        Output output = new Output(number);
        output.setTags(t.getAsString());
        outputList.add(output);
    })

    element.get("actions").getAsJsonArray().forEach(a -> {
        Output output = new Output(number);
        output.setActionsMoment(a.getAsJsonObject().get("moment").getAsString());
        output.setActionsDescription(a.getAsJsonObject().get("description").getAsString());
        outputList.add(output);
    });
})

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

【讨论】:

  • 直截了当的方法对我来说不是一个选择(对不起,我的问题没有那么详细,我现在已经改进了)
  • 您好,您的解释还不够清楚。我看不到你说的itemsactions之间的关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多