【问题标题】:How do I create list of json objects where all the keys are unique guids如何创建所有键都是唯一 guid 的 json 对象列表
【发布时间】:2020-11-17 03:55:58
【问题描述】:

我有一个我需要映射的 json 响应,不幸的是它没有键值对来启动。键都是单独的 guid,值是数据列表。下面是一个如何格式化的例子。我正在尝试找出一种创建对象列表的方法,例如:

HashMap 这样...

字符串名称:“guid1”

字符串值:“json 响应的其余部分”

或类似的,只要我可以在 guid 上搜索以获取我需要的值。

下面是代码示例:

{
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxx1": {
"values": {
 "item1":"value1"
"item2":"value2"
"item3":"value3"
}
},
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxx2": {
"values": {
 "item1":"value1"
"item2":"value2"
"item3":"value3"
}
},
......more entries
}

我希望在调用 guid 的情况下获得类似以下内容,但没有运气:

{
"guid":"xxxxxxxe-xxxx-xxxx-xxxx-xxxxxx1",
"values": {
  "item1":"value1"
  "item2":"value2"
  "item3":"value3"
 }
}

对如何映射此类数据有任何建议吗?我需要依次获取值信息并进一步映射。

编辑 - 更喜欢使用 jackson,因为我已经在我的代码的其他部分这样做了。

编辑 2 - 我做了以下操作,但我得到了一种非常丑陋的处理方式,但我仍然希望有人可以提供更简单的解决方案:


Map<String, Map<String, Map<String, String>>> attributes = new HashMap<String,Map<String, Map<String, String>>>();
attributes =new Gson().fromJson(jsonString, Map.class);

//and then...
Map valueString = attributes.get("xxxx-xxx-xxx);
Map nestMap= (Map) valueString.get("values");
String theInfoINeed = (String)nestMap.get("item1");


【问题讨论】:

标签: java json jackson


【解决方案1】:

使用Jackson,您还可以将上述有效负载反序列化为Map&lt;String, Map&lt;String, Map&lt;String, String&gt;&gt;&gt;。在反序列化过程之后,如果需要,您可以将其转换为 POJO。看看下面的例子:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.ToString;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class JsonMapsApp {
    public static void main(String[] args) throws IOException {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        Map<String, Map<String, Object>> result = mapper.readValue(jsonFile, new TypeReference<Map<String, Map<String, Object>>>() {});

        List<Item> items = result.entrySet().stream().map(e -> {
            Item item = mapper.convertValue(e.getValue().get("values"), Item.class);
            item.setGuid(e.getKey());
            return item;
        }).collect(Collectors.toList());

        items.forEach(System.out::println);
    }
}

@Data
@ToString
class Item {
    private String guid;
    private String item1;
    private String item2;
    private String item3;
}

上面的代码打印:

Item(guid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxx1, item1=value1, item2=value2, item3=value3)
Item(guid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxx2, item1=value1, item2=value2, item3=value3)

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2021-09-05
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多