当前位置: 首页 > 知识库问答 >
问题:

如何从JSON而不是LinkedHashMap获取List对象?

潘坚白
2023-03-14

我有一个方法,它应该从JSON返回不同的对象,这取决于参数中的类类型。我试着根据参数返回一个对象列表,但是我只把LinkedHashMap放入ArrayList。

我搜索了很多,但是在解决方案中,类类型的所有地方都是硬编码的。

有没有一种不用硬代码就能解决这个问题的方法?

 public static <T> List<T> getObjects(Class<T> c) {
    CloseableHttpClient rest =  HttpClientSessionSingleton.getInstance().getHttpClient();
    String urlRequest = (host + "/" +
            c.getSimpleName().toLowerCase() + "s");

    HttpGet httpGet = new HttpGet(urlRequest);
    try (CloseableHttpResponse response = rest.execute(httpGet)) {
        HttpEntity entity = response.getEntity();
        String jsonString = EntityUtils.toString(entity);

        List<T> listObjectFromJson = new ObjectMapper().readValue(jsonString, new TypeReference<List<T>>(){});

        return listObjectFromJson;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

我只想传递类类型并通过一个方法获取对象

[
{
"id": "73cbc0b5-3dd5-49c4-97cb-6225a19122b5",
"name": "Management",
"fields": [
{
"id": "c2d740d5-4d47-42ae-b616-977b40327812",
"name": "newField1"
}
]
},
{
"id": "dd74384b-717d-4368-b0e4-3f441d5b1ffc",
"name": "IT",
"fields": []
},
{
"id": "03304335-d7d7-46ca-8075-8d5e9feb43c6",
"name": "hhh",
"fields": []
},
{
"id": "e11b4c3f-080e-490d-8ef4-ea301d551a5d",
"name": "NEWWWWW",
"fields": []
},
{
"id": "fec7eeb0-0845-49be-be14-6cdb5fcd3575",
"name": "NEWWWWW",
"fields": []
},
{
"id": "50dfea14-f30a-448c-99df-10bf01d088fa",
"name": "NEWWWWW",
"fields": []
},
{
"id": "a4a1224e-7c66-484c-ae87-dc2ecc058c36",
"name": "NEWWWWW",
"fields": []
}
]

当我的对象有关系时,我得到这个例外

无法识别的字段"字段"(类model.orm.部门),在[Source:(String)"[{"id":"73cbc0b5-3dd5-49c4-97cb-6225a19122b5","name":"Management","字段":[{"id":"c2d740d5-4d47-42ae-b616-977b40327812","name":"newField1"}]},{"id":"dd74384b-717d-4368-b0e4-3f441d5b1ffc","name":"IT","字段":[]},{"id":"03304335-d7d7-46ca-8075-8d5e9feb43c6","name":"hhhh","字段":[]},{"id":"e11b4c3f-080e-490d-8ef4-ea30c":"50dfe14-f30a-448c-99df-10bf01d088fa","name":"NEWWWW","fie"[截断84个字符];行: 1,列: 77](通过引用链:java.util.ArrayList[0]-

共有1个答案

张瀚漠
2023-03-14

您可以构造一个新的JavaType参数化类型,将列表作为参数传递。类对象映射器。html#getTypeFactory方法如下:

public static <T> List<T> getObjects(Class<T> c) throws IOException {
    //omitted the lines before creating the mapper including the jsonstring
    ObjectMapper mapper = new ObjectMapper();
    JavaType type = mapper.getTypeFactory().constructParametricType(List.class, c);
    
    return mapper.readValue(jsonString, type);
}
 类似资料:
  • 问题内容: 我正在使用 Python 2 从 ASCII编码的 文本文件中解析JSON 。 当使用或 加载这些文件时,我所有的字符串值都转换为Unicode对象而不是字符串对象。问题是,我必须将数据与仅接受字符串对象的某些库一起使用。我 无法更改库, 也 无法 更新它们。 是否可以获取字符串对象而不是Unicode对象? 更新资料 很久以前 ,当我坚持使用 Python 2 时就问 了 这个问题。

  • 问题内容: 我有 我想按 位置 获得 职位, 而不是关键 职位 。 我不想使用迭代。 还有其他方法可以基于索引获取Value吗? 问题答案: 您无法获得基于索引的值,只是那样行不通。一种解决方法是根据您的值创建一个新列表,然后根据索引获取值。

  • 问题内容: 我正在使用Python 2从ASCII编码的文本文件中解析JSON 。 用json或 加载这些文件时simplejson,我所有的字符串值都转换为Unicode对象而不是字符串对象。问题是,我必须将数据与仅接受字符串对象的某些库一起使用。我无法更改库,也无法更新它们。 是否可以获取字符串对象而不是Unicode对象? 例 问题答案: 解决方案 用法示例: 它是如何工作的,为什么要使用它

  • 问题内容: 我想做的是从而不是从Volley库中使用一些数据。 以下是用于从服务器中获取JSON对象的代码。 我试图改变到后改为。但这并没有解决。 问题答案: 中的url 不是可选的,并且JSONObject参数用于将带有请求的参数发布到url。 从文档中:http : //afzaln.com/volley/com/android/volley/toolbox/JsonObjectRequest

  • 我试图获取一个结果集并将其强制转换为bean。不起作用。但后来我试着向bean列表进行了强制转换,它起作用了。有人能告诉我如何使用Jdbctemplate和RowMapping直接获取Bean对象吗? 如果有没有行映射器的其他解决方案,那就更好了。因为在表中,我有50+列,所以很难创建具有这些字段的Bean

  • 我正在使用重新保证的框架,在它里面,它有JsonPath类。JsonPath有一个getList的方法签名(String path,Class T); 我试图做这样的事情: 我得到了一个运行时强制转换异常。那么,调用它的正确格式是什么呢。我还试图: 这也失败了。实际上编译失败了。