将具有重复键的JSON反序列化为Java对象内的列表

6kkfgxo0  于 2023-02-14  发布在  Java
关注(0)|答案(1)|浏览(166)

如果一个"action"键-值对重复出现,我想把每个相关的"myObject"添加到一个列表中,如下所示。有没有办法使用GSON或JACKSON来实现这个目的?不幸的是,没有编辑输入JSON的选项。如果这个问题不清楚,请告诉我。
输入

[
  {
    myObject: {
      name: "foo",
      description: "bar"
    },
    action: "create",
  },
  {
    myObject: {
      name: "baz",
      description: "qux"
    },
    action: "create",
  },
];

所需输出

{
    "action": "create",
    "myObject": [
        {
          name: "foo",
          description: "bar"
        },
        {
          name: "baz",
          description: "qux"
        },
    ]
};

我是Java中JSON解析的新手,不幸的是还没有在StackOverflow上找到像我这样的用例。我试着这样配置我的ObjectMapper-

new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

并使用

@JsonAnySetter

注解,但还没有让它们工作。

jq6vz3qz

jq6vz3qz1#

你可以用两个单独的模型类来解决这个问题,一个用于原始结构,一个用于转换后的结构。为了简单起见,我在下面称它们为OriginalModelTransformedModel,你可能应该选择更有意义的名称。下面的代码使用Gson,但你可能也可以用Jackson实现类似的功能。

class OriginalModel {
    String action;
    MyObjectData myObject;
}

class TransformedModel {
    String action;
    List<MyObjectData> myObject;

    public TransformedModel(String action, List<MyObjectData> myObject) {
        this.action = action;
        this.myObject = myObject;
    }
}

class MyObjectData {
    String name;
    String description;
}

如果你声明这些类为嵌套类,你应该使它们成为static
然后,您可以首先使用原始模型类解析JSON数据,使用转换后的类手动创建所需的结果结构,并将其序列化为JSON:

Gson gson = new Gson();
List<OriginalModel> originalData = gson.fromJson(json, new TypeToken<List<OriginalModel>>() {});

// Group MyObjectData objects by action name
// Uses LinkedHashMap to preserve order
Map<String, List<MyObjectData>> actionsMap = new LinkedHashMap<>();
for (OriginalModel model : originalData) {
    actionsMap.computeIfAbsent(model.action, k -> new ArrayList<>())
        .add(model.myObject);
}

List<TransformedModel> transformedData = new ArrayList<>();
for (Map.Entry<String, List<MyObjectData>> entry : actionsMap.entrySet()) {
    transformedData.add(new TransformedModel(entry.getKey(), entry.getValue()));
}

String transformedJson = gson.toJson(transformedData);

相关问题