首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何用JSONObject代替HashMap返回ResponseEntity?(没有找到类型返回值的转换器:org.json.JSONObject类)

如何用JSONObject代替HashMap返回ResponseEntity?(没有找到类型返回值的转换器:org.json.JSONObject类)
EN

Stack Overflow用户
提问于 2018-09-19 04:38:56
回答 2查看 4.3K关注 0票数 0

我能够从构建在Spring上的REST中返回一个HashMap作为JSON。在这里,我的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ResponseBody
@Transactional
@GetMapping("create_coinmarketcap_snapshot")
public ResponseEntity<HashMap> create_coinmarketcap_snapshot() {

    String jsonString = callURL("https://api.coinmarketcap.com/v2/ticker/?limit=5");

    JSONArray coinmarketcapsnapshotsArray = new JSONArray();
    JSONObject coinmarketcapsnapshotsJSONObject = new JSONObject();
    HashMap<Integer, CoinmarketcapSnapshot> coinmarketcapsnapshotsHashMap = new HashMap<>();

    try {

        JSONObject jsonObject = new JSONObject(jsonString);
        JSONObject jsonObjectData = jsonObject.getJSONObject("data");
        Iterator<?> keys = jsonObjectData.keys();

        int count = 0;

        while (keys.hasNext()) {

            count++;

            String key = (String) keys.next();

            if (jsonObjectData.get(key) instanceof JSONObject) {

                JSONObject jsonObjectDataCrypto = jsonObjectData.getJSONObject(key);
                JSONObject jsonObjectDataCryptoQuotes = jsonObjectDataCrypto.getJSONObject("quotes").getJSONObject("USD");

                CoinmarketcapSnapshot coinmarketcapsnapshotObject = new CoinmarketcapSnapshot();
                String dateFormatted = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime());
                coinmarketcapsnapshotObject.setTitle(jsonObjectDataCrypto.get("name") + " - " + dateFormatted);
                coinmarketcapsnapshotObject.setCryptocurrencyId((int) jsonObjectDataCrypto.get("id"));
                if(jsonObjectDataCrypto.get("rank")!=null){
                    coinmarketcapsnapshotObject.setRank((int) jsonObjectDataCrypto.get("rank"));
                }
                if(jsonObjectDataCrypto.get("circulating_supply")!=null){
                    coinmarketcapsnapshotObject.setCirculatingSupply((Double) jsonObjectDataCrypto.get("circulating_supply"));
                }
                if(jsonObjectDataCrypto.get("total_supply")!=null){
                    coinmarketcapsnapshotObject.setTotalSupply((Double) jsonObjectDataCrypto.get("total_supply"));
                }
                if(!jsonObjectDataCrypto.isNull("circulating_supply")) {
                    coinmarketcapsnapshotObject.setMaxSupply((Double) jsonObjectDataCrypto.get("circulating_supply"));
                }
                if(!jsonObjectDataCrypto.isNull("total_supply")) {
                    coinmarketcapsnapshotObject.setMaxSupply((Double) jsonObjectDataCrypto.get("total_supply"));
                }
                if(!jsonObjectDataCrypto.isNull("max_supply")) {
                    coinmarketcapsnapshotObject.setMaxSupply((Double) jsonObjectDataCrypto.get("max_supply"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("price")) {
                    coinmarketcapsnapshotObject.setPrice((Double) jsonObjectDataCryptoQuotes.get("price"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("volume_24h")) {
                    coinmarketcapsnapshotObject.setVolume24h((Double) jsonObjectDataCryptoQuotes.get("volume_24h"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("market_cap")) {
                    coinmarketcapsnapshotObject.setMarketCap((Double) jsonObjectDataCryptoQuotes.get("market_cap"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("percent_change_1h")) {
                    coinmarketcapsnapshotObject.setPercentChange1h((Double) jsonObjectDataCryptoQuotes.get("percent_change_1h"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("percent_change_24h")) {
                    coinmarketcapsnapshotObject.setPercentChange24h((Double) jsonObjectDataCryptoQuotes.get("percent_change_24h"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("percent_change_7d")) {
                    coinmarketcapsnapshotObject.setPercentChange7d((Double) jsonObjectDataCryptoQuotes.get("percent_change_7d"));
                }

                entityManager.persist(coinmarketcapsnapshotObject);
                coinmarketcapsnapshotsArray.put(coinmarketcapsnapshotObject);
                coinmarketcapsnapshotsJSONObject.put(String.valueOf(count),coinmarketcapsnapshotObject);
                coinmarketcapsnapshotsHashMap.put(count, coinmarketcapsnapshotObject);
            }
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

    System.out.println("\n\ncoinmarketcapsnapshotsArray:\n"+coinmarketcapsnapshotsArray);
    System.out.println("\n\ncoinmarketcapsnapshotsJSONObject:\n"+coinmarketcapsnapshotsJSONObject);
    System.out.println("\n\ncoinmarketcapsnapshotsHashMap:\n"+coinmarketcapsnapshotsHashMap);

    return new ResponseEntity<>(coinmarketcapsnapshotsHashMap, HttpStatus.OK);
}

下面是终端上打印的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
coinmarketcapsnapshotsArray:
["com.krown.entity.CoinmarketcapSnapshot@4d60f69f","com.krown.entity.CoinmarketcapSnapshot@4739c2f2","com.krown.entity.CoinmarketcapSnapshot@7d5bd573","com.krown.entity.CoinmarketcapSnapshot@43b5eb6d","com.krown.entity.CoinmarketcapSnapshot@26e1a633"]


coinmarketcapsnapshotsJSONObject:
{"1":"com.krown.entity.CoinmarketcapSnapshot@4d60f69f","2":"com.krown.entity.CoinmarketcapSnapshot@4739c2f2","3":"com.krown.entity.CoinmarketcapSnapshot@7d5bd573","4":"com.krown.entity.CoinmarketcapSnapshot@43b5eb6d","5":"com.krown.entity.CoinmarketcapSnapshot@26e1a633"}


coinmarketcapsnapshotsHashMap:
{1=com.krown.entity.CoinmarketcapSnapshot@4d60f69f, 2=com.krown.entity.CoinmarketcapSnapshot@4739c2f2, 3=com.krown.entity.CoinmarketcapSnapshot@7d5bd573, 4=com.krown.entity.CoinmarketcapSnapshot@43b5eb6d, 5=com.krown.entity.CoinmarketcapSnapshot@26e1a633}

我想返回我的JSONObject "coinmarketcapsnapshotsJSONObject“而不是"coinmarketcapsnapshotsHashMap",但是当我这样做时,我一直被这个错误困住了:

没有找到类型返回值的转换器: org.json.JSONObject类

正如在web上发现的一些帖子所建议的那样,我在pom.xml文件中添加了Jackson作为新的依赖项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.0</version>
</dependency>

不幸的是,这并没有改变什么。

您是否建议改进在Spring上为REST构建JSON的过程?

当我返回HashMap时,输出如下所示:

EN

回答 2

Stack Overflow用户

发布于 2018-09-22 10:34:00

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping(produces={MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<?> create_coinmarketcap_snapshot() throws IOException {
    UriComponentsBuilder builder = 
        UriComponentsBuilder.fromUriString("https://api.coinmarketcap.com/v2/ticker")
            .queryParam("limit", "5");

    ResponseEntity<String> response = 
        restTemplate.getForEntity(builder.toUriString(), String.class);

    ObjectMapper mapper = new ObjectMapper();
    JsonNode root = mapper.readTree(response.getBody());
    JsonNode data = root.path("data");

    data.forEach(jsonObject -> {
        jsonObject.get("rank"); //extracting values from each json object
        jsonObject.get("circulating_supply");
        jsonObject.get("total_supply");
        jsonObject.get("max_supply");
        jsonObject.get("price");
        jsonObject.get("volume_24h");
        jsonObject.get("market_cap");
        jsonObject.get("percent_change_1h");
        jsonObject.get("percent_change_24h");
        //... and so on         
    });     

    return ResponseEntity.ok(data); 
}   

现在返回一个包含"data“key @118218值的json对象

票数 0
EN

Stack Overflow用户

发布于 2018-09-22 10:48:36

HttpStatus.OK是使用Spring的Http端点的默认返回值,因此没有必要指定它,从而使整个ResponseEntity变得不必要:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ResponseBody
@Transactional
@GetMapping("create_coinmarketcap_snapshot")
public HashMap create_coinmarketcap_snapshot() {

    String jsonString = callURL("https://api.coinmarketcap.com/v2/ticker/?limit=5");

    JSONArray coinmarketcapsnapshotsArray = new JSONArray();
    JSONObject coinmarketcapsnapshotsJSONObject = new JSONObject();
    HashMap<Integer, CoinmarketcapSnapshot> coinmarketcapsnapshotsHashMap = new HashMap<>();

    try {

        JSONObject jsonObject = new JSONObject(jsonString);
        JSONObject jsonObjectData = jsonObject.getJSONObject("data");
        Iterator<?> keys = jsonObjectData.keys();

        int count = 0;

        while (keys.hasNext()) {

            count++;

            String key = (String) keys.next();

            if (jsonObjectData.get(key) instanceof JSONObject) {

                JSONObject jsonObjectDataCrypto = jsonObjectData.getJSONObject(key);
                JSONObject jsonObjectDataCryptoQuotes = jsonObjectDataCrypto.getJSONObject("quotes").getJSONObject("USD");

                CoinmarketcapSnapshot coinmarketcapsnapshotObject = new CoinmarketcapSnapshot();
                String dateFormatted = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime());
                coinmarketcapsnapshotObject.setTitle(jsonObjectDataCrypto.get("name") + " - " + dateFormatted);
                coinmarketcapsnapshotObject.setCryptocurrencyId((int) jsonObjectDataCrypto.get("id"));
                if(jsonObjectDataCrypto.get("rank")!=null){
                    coinmarketcapsnapshotObject.setRank((int) jsonObjectDataCrypto.get("rank"));
                }
                if(jsonObjectDataCrypto.get("circulating_supply")!=null){
                    coinmarketcapsnapshotObject.setCirculatingSupply((Double) jsonObjectDataCrypto.get("circulating_supply"));
                }
                if(jsonObjectDataCrypto.get("total_supply")!=null){
                    coinmarketcapsnapshotObject.setTotalSupply((Double) jsonObjectDataCrypto.get("total_supply"));
                }
                if(!jsonObjectDataCrypto.isNull("circulating_supply")) {
                    coinmarketcapsnapshotObject.setMaxSupply((Double) jsonObjectDataCrypto.get("circulating_supply"));
                }
                if(!jsonObjectDataCrypto.isNull("total_supply")) {
                    coinmarketcapsnapshotObject.setMaxSupply((Double) jsonObjectDataCrypto.get("total_supply"));
                }
                if(!jsonObjectDataCrypto.isNull("max_supply")) {
                    coinmarketcapsnapshotObject.setMaxSupply((Double) jsonObjectDataCrypto.get("max_supply"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("price")) {
                    coinmarketcapsnapshotObject.setPrice((Double) jsonObjectDataCryptoQuotes.get("price"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("volume_24h")) {
                    coinmarketcapsnapshotObject.setVolume24h((Double) jsonObjectDataCryptoQuotes.get("volume_24h"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("market_cap")) {
                    coinmarketcapsnapshotObject.setMarketCap((Double) jsonObjectDataCryptoQuotes.get("market_cap"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("percent_change_1h")) {
                    coinmarketcapsnapshotObject.setPercentChange1h((Double) jsonObjectDataCryptoQuotes.get("percent_change_1h"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("percent_change_24h")) {
                    coinmarketcapsnapshotObject.setPercentChange24h((Double) jsonObjectDataCryptoQuotes.get("percent_change_24h"));
                }
                if(!jsonObjectDataCryptoQuotes.isNull("percent_change_7d")) {
                    coinmarketcapsnapshotObject.setPercentChange7d((Double) jsonObjectDataCryptoQuotes.get("percent_change_7d"));
                }

                entityManager.persist(coinmarketcapsnapshotObject);
                coinmarketcapsnapshotsArray.put(coinmarketcapsnapshotObject);
                coinmarketcapsnapshotsJSONObject.put(String.valueOf(count),coinmarketcapsnapshotObject);
                coinmarketcapsnapshotsHashMap.put(count, coinmarketcapsnapshotObject);
            }
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

    System.out.println("\n\ncoinmarketcapsnapshotsArray:\n"+coinmarketcapsnapshotsArray);
    System.out.println("\n\ncoinmarketcapsnapshotsJSONObject:\n"+coinmarketcapsnapshotsJSONObject);
    System.out.println("\n\ncoinmarketcapsnapshotsHashMap:\n"+coinmarketcapsnapshotsHashMap);

    return coinmarketcapsnapshotsHashMap;

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52406081

复制
相关文章
为什么数组下标从 0 开始?而不是 1?
鱼皮最新原创项目教程,欢迎学习 大家好,我是鱼皮。很多小伙伴初学编程的时候都被元素下标折磨过,为什么很多编程语言要把 0 作为第一个下标索引,而不是直观的 1 呢? 这个问题 Dijkstra 已经解答过了,没错,就是你知道的 Dijkstra,Dijkstra 最短路径算法,荷兰语全名是 Edsger Wybe Dijkstra,于 1972 年获得了图灵奖,除了上面说的最短路径算法,还有众所周知的信号量和 PV 原语、银行家算法等也是这位巨佬提出的。 原文在这里:https://www.cs.u
程序员鱼皮
2023/03/29
9040
为什么数组下标从 0 开始?而不是 1?
是否还在疑惑Vue.js中组件的data为什么是函数类型而不是对象类型
要理解本篇文章,必须具备JavaScript中基本数据类型和引用数据类型的概念,大家可以花两分钟看一下,瞬间就能理解——面试题被问到再也不慌,深究JavaScript中的深拷贝与浅拷贝,看完这篇文章以后,再来看这篇文章就会很容易理解了。
@零一
2021/01/29
3.5K0
是否还在疑惑Vue.js中组件的data为什么是函数类型而不是对象类型
回文数中各位数和与输入数相同
通过Python的各种函数和逻辑关系可以比较方便的做到相对于自己来说计算量比较大的问题。
算法与编程之美
2022/05/23
2410
SSL 中证书能否够使用IP而不是域名[通俗易懂]
前言:曾经听别人说生成证书时能够用IP地址。今天用样例证实了下用IP地址是不行的。
全栈程序员站长
2022/01/24
1K0
为什么 build 方法放在 State 中而不是在 StatefulWidget 中
为什么 build 方法放在 State 中而不是在 StatefulWidget 中呢?其中前2点是源代码的注释中给出的原因,最后一点是我的一点个人理解。
老孟Flutter
2021/01/28
9130
何时使用MongoDB而不是MySql
MySQL 和 MongoDB 是两个可用于存储和管理数据的数据库管理系统。MySQL 是一个关系数据库系统,以结构化表格格式存储数据。相比之下,MongoDB 以更灵活的格式将数据存储为 JSON 文档。两者都提供性能和可扩展性,但它们为不同的应用场景提供了更好的性能。
wayn
2023/08/09
1K0
何时使用MongoDB而不是MySql
何时使用Kafka而不是RabbitMQ
Kafka 和 RabbitMQ 都是流行的开源消息系统,它们可以在分布式系统中实现数据的可靠传输和处理。Kafka 和 RabbitMQ 有各自的优势和特点,它们适用于不同的场景和需求。本文将比较 Kafka 和 RabbitMQ 的主要区别,并分析何时使用 Kafka 而不是 RabbitMQ。
wayn
2023/06/26
3540
何时使用Kafka而不是RabbitMQ
何时使用Elasticsearch而不是MySql
MySQL 和 Elasticsearch 是两种不同的数据管理系统,它们各有优劣,适用于不同的场景
wayn
2023/08/28
3020
何时使用Elasticsearch而不是MySql
何时使用Kafka而不是RabbitMQ
Kafka 和 RabbitMQ 都是流行的开源消息系统,它们可以在分布式系统中实现数据的可靠传输和处理。Kafka 和 RabbitMQ 有各自的优势和特点,它们适用于不同的场景和需求。本文将比较 Kafka 和 RabbitMQ 的主要区别,并分析何时使用 Kafka 而不是 RabbitMQ。
wayn
2023/08/28
2580
何时使用Kafka而不是RabbitMQ
何时使用Elasticsearch而不是MySql
MySQL 和 Elasticsearch 是两种不同的数据管理系统,它们各有优劣,适用于不同的场景。本文将从以下几个方面对它们进行比较和分析:
wayn
2023/08/09
6880
何时使用Elasticsearch而不是MySql
java中怎么输入数组_java中如何从键盘输入数组
java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。
全栈程序员站长
2022/09/13
4K0
做产品经理而不是功能经理
产品经理是个很奇怪的岗位,好像大多数人都能做,因为每个人对某个产品都有自己的看法,都能提出一些意见和想法,甚至能设计实现原理;也好像大多数人都做不好产品经理,因为互联网上成千上万个产品,大部分是垃圾,
用户1756920
2018/06/20
1.1K0
MySQL重大Bug!自增主键竟然不是连续递增
AUTO_INCREMENT=2,表示下一次插入数据时,若需要自动生成自增值,会生成id=2。
JavaEdge
2021/12/07
3.6K0
MySQL重大Bug!自增主键竟然不是连续递增
Java中为什么要使用单继承而不是多继承?
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。
Vincent-yuan
2021/10/13
1.7K0
什么在代码中要求我们使用LocalDateTime而不是Date?
在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗?
用户1516716
2019/11/24
1.1K0
MySQL重大Bug!自增主键竟然不是连续递增
AUTO_INCREMENT=2,表示下一次插入数据时,若需要自动生成自增值,会生成id=2。
JavaEdge
2021/10/18
2.6K0
android推荐使用dialogFrament而不是alertDialog
DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。 在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框。 2、 好处与用法 使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。且Dia
xiangzhihong
2018/01/29
2.4K0
android推荐使用dialogFrament而不是alertDialog
WideNet:让网络更宽而不是更深
这是新加坡国立大学在2022 aaai发布的一篇论文。WideNet是一种参数有效的框架,它的方向是更宽而不是更深。通过混合专家(MoE)代替前馈网络(FFN),使模型沿宽度缩放。使用单独LN用于转换各种语义表示,而不是共享权重。
deephub
2023/08/30
2180
WideNet:让网络更宽而不是更深
云原生关乎文化,而不是容器
本文译自 Cloud-Native Is about Culture, Not Containers[1],文章洋洋洒洒上万字,作者总结了她见过的云原生失败的各种经验教训,还用生动的示例说明了什么不是云原生。译者是在周末闲暇时间仓促间翻译的,其中难免有不当之处,请读者指正。译者:宋净超(Jimmy Song)
xcbeyond
2021/04/02
5040
从MySQL主键为何单调递增说起
主键(primary key),一列 (或一组列),其值能够唯一区分表中的每个行。唯一标识表中每行的这个列(或这组列)称为主键。主键用来表示一个特定的行。没有主键,更新或删除表中特定行很困难,因为没有安全方法保证只涉及相关的行而不误伤其他行!
JavaEdge
2022/11/30
2.1K0

相似问题

输入类型号递增追加编号而不是递增

115

递增/递减值而不过度

50

mysql中的递减值而不是负值

78

Material onClick to递增或递减值

311

AVR汇编,从数据存储器中递增和递减值

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文