java里怎么解析mybatis返回的单条map类型集合?


上图是数据表查询,返回Map类型的XML映射写法

上图写了个@MapKey注解,不写会报错

这是最终调试的参数值,是个单条Map类型,有动态的key,有value,value是一个单条数据表记录集合,
这个怎么解析呢?无论我尝试了多种途径,都不好用,
我用fastjson解析也不行。
请教大神!


我尝试的操作

//获取登陆用户的id和openid
        Map<String, Object> wxUserInfo = wxLoginMapper.getWxUserByOpenidInfo(params.getOpenId());
        String jsonString = "";
        for(String key : wxUserInfo.keySet()){
            jsonString = JSON.toJSONString(wxUserInfo.get(key));
        }
        log.info(jsonString);

code: 500
message: "操作失败,java.lang.Integer cannot be cast to java.lang.String"
result: null
success: false
timestamp: 1735821282293

针对回答 **

解析出来是这样子的,我主要想获取openid的值,这个字符串怎么获取openid的值呢,关键前面的key是动态的?

阅读 1.9k
1 个回答

思路排查

Mapper接口和XML配置

public interface WxLoginMapper {
    Map<String, Object> getWxUserByOpenidInfo(String openId);
}
<select id="getWxUserByOpenidInfo" resultType="java.util.HashMap">
    SELECT * FROM yy_xx WHERE openid=#{openId}
</select>

添加fastjson依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>

在Spring Boot应用中使用Mapper,在Service类中解析JSON字符串并提取openid的值:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Service
public class WxLoginService {
    private static final Logger log = LoggerFactory.getLogger(WxLoginService.class);

    @Autowired
    private WxLoginMapper wxLoginMapper;

    public void logWxUserInfo(String openId) {
        Map<String, Object> wxUserInfo = wxLoginMapper.getWxUserByOpenidInfo(openId);
        String jsonString = JSON.toJSONString(wxUserInfo);

        // 解析JSON字符串为JSONObject
        JSONObject jsonObject = JSON.parseObject(jsonString);

        // 获取动态key的第一个值
        String dynamicKey = jsonObject.keySet().iterator().next();
        JSONObject innerObject = jsonObject.getJSONObject(dynamicKey);

        // 获取openid的值
        String openid = innerObject.getString("openid");

        // 输出openid
        log.info("OpenID: " + openid);
    }
}

在Controller中调用Service:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class WxLoginController {
    @Autowired
    private WxLoginService wxLoginService;

    @GetMapping("/logWxUserInfo")
    public ResponseEntity<Void> logWxUserInfo(@RequestParam String openId) {
        wxLoginService.logWxUserInfo(openId);
        return ResponseEntity.ok().build();
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏