有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何访问JSON对象的名称?

我从Firebase实时数据库返回了这个JSON

{
       "betslipid-4322": {
            "amount": 100,
            "bets": [
                {
                    "betType": "FT_RESULT_0",
                    "matchid": "ts-fb",
                    "odd": 2.4,
                    "status": "WAITING"
                }
            ],
            "status": "WAITING"
        },
        "betslipid-4323": {
            "amount": 7.5,
            "bets": [
                {
                    "betType": "FT_RESULT_2",
                    "matchid": "gs-fb",
                    "odd": 2.7,
                    "status": "WAITING"
                },
                {
                    "betType": "FT_RESULT_1",
                    "matchid": "gs-gb",
                    "odd": 1.3,
                    "status": "WAITING"
                }
            ],
            "status": "WAITING"
        }
}

我想把这个JSON的属性(包括开头的属性)放在下面的Java类中

public class BetSlip {

    private List<Bet> bets;

    private Float amount;

    private BetStatus status;

    private betSlipID;
}

但是,在本例中,我无法访问betslipid,即“betslipid-4322”和“betslipid-4323”,并且我也无法通过以下代码将JSON转换为我的java类

private RestTemplate restTemplate = new RestTemplate();
List<BetSlip> betSlip = restTemplate.getForObject(getDatabaseLink("incomplete-betslips"), ArrayList.class);

请注意,当我得到JSON响应时,我不知道betSlipID的名称,因此我无法创建另一个包含名为传入betSlipID的变量的类


共 (2) 个答案

  1. # 1 楼答案

    我并不是说这是最优的,但你可以按照这个来完成你的任务,因为你的betslipid-x是可变的,我只描述了要遵循的步骤:

    1. 只需从restTemplate返回一个json对象,请参见Spring restTemplate get raw json string
    2. 在返回的json上应用keySet()键,您将获得所有的密钥
    3. 基于此,获取该键的关联对象,并在BetSlip类中反序列化,并将该键设置为betSlipID
    4. 这样你就得到了你想要的东西

    这应该是你的工作
    如果您需要进一步澄清,请告诉我

  2. # 2 楼答案

    以下是@Noshaf的评论:

    HashMap<String,BetSlip> betSlipWithoutID = restTemplate.getForObject(getDatabaseLink("incomplete-betslips"), HashMap.class);
    

    创建此HashMap后,现在需要使用betSlipID创建BetSlip类:

    ObjectMapper mapper = new ObjectMapper();
    
    BetSlip betSlip = mapper.convertValue(betSlipWithoutID.get(betSlipWithoutID.keySet().iterator().next()), BetSlip.class);
    
    betSlip.setBetSlipID(betSlipWithoutID.keySet().iterator().next());
    

    现在,betSlip已准备就绪,可以在设置了betSlip属性的情况下使用