当Json文件具有相同的键值时,如何使用HashMap

3

我的 JSON 文件长这样 [实际上它有更多,我只是举了两个例子]:

[{
        "answerValue": "2021-02-01",
        "parentId": "Policy",
        "instance": 1,
        "fieldId": "PolicyEffectiveDate"
    },
    {
        "answerValue": "2012",
        "parentId": "Insured",
        "instance": 1,
        "fieldId": "DateBusinessStarted"
    }
]

我想将它们存储在一个HashMap中并打印出来。
public void MapCheck() {

        Map<String, Object> dataMap = new HashMap<>();
        List<Map> lstMap = new ArrayList<>();


        dataMap.put("answerValue:", "2021-02-01");
        dataMap.put("parentId:", "Policy");
        dataMap.put("instance:", 1);
        dataMap.put("fieldId:", "PolicyEffectiveDate");
        lstMap.add(dataMap);

        dataMap.put("answerValue:", "Assurestart LLC");
        dataMap.put("parentId:", "Insured");
        dataMap.put("instance:", 1);
        dataMap.put("fieldId:", "Business_Name");
        lstMap.add(dataMap);

        System.out.println(lstMap);
    }


    public static void main(String[] args) {
        Test t = new Test();

        t.MapCheck();
    }
}

期望:我希望它能打印出来

[{parentId:=Policy, fieldId:=PolicyEffectiveDate, answerValue:=2021-02-01, instance:=1}, {parentId:=Insured, fieldId:=Business_Name, answerValue:=Assurestart LLC, instance:=1}]

实际情况是:它会打印出最后一个值两次。

[{parentId:=Insured, fieldId:=Business_Name, answerValue:=Assurestart LLC, instance:=1}, {parentId:=Insured, fieldId:=Business_Name, answerValue:=Assurestart LLC, instance:=1}]

我该如何使其打印2个不同的值?感谢您的时间和想法。


你正在将两个指向同一个哈希映射的引用放入列表中。只要在第一次调用“add”后添加“dataMap = new HashMap <>();”,这样您就可以为第二个元素创建一个映射。 - Jon Skeet
3个回答

5

你应该为第二个条目创建一个新的映射,而不是覆盖第一个条目的值。添加

dataMap = new HashMap<>();

在列表中添加第一个条目后。


3
你应该为列表中的第二个地图创建一个新地图:
    Map<String, Object> dataMap = new HashMap<>();
    List<Map<String, Object>> lstMap = new ArrayList<>();


    dataMap.put("answerValue:", "2021-02-01");
    dataMap.put("parentId:", "Policy");
    dataMap.put("instance:", 1);
    dataMap.put("fieldId:", "PolicyEffectiveDate");
    lstMap.add(dataMap);

    dataMap = new HashMap<>(); // create a new map!
    dataMap.put("answerValue:", "Assurestart LLC");
    dataMap.put("parentId:", "Insured");
    dataMap.put("instance:", 1);
    dataMap.put("fieldId:", "Business_Name");
    lstMap.add(dataMap);

如果你需要生成JSON或读取一个JSON文件,我建议使用JSON序列化/反序列化库,例如GSON。这样,你可以将你的数据表示成类而不是哈希映射:

class MyObject {
    private String answerValue;
    private String parentId;
    private int instance;
    private String fieldId;

    // getters & setters...
}

1
作为您所知道的,HashMap是一种基于唯一键和值对属性工作的数据结构。 在上面的示例中,当您执行dataMap.put("answerValue:", "2021-02-01");时,它会将该键的值保存在HashMap中。但是当您第二次执行dataMap.put("answerValue:", "Assurestart LLC");时,它会覆盖"answerValue:"键的值,因为它已经存在于那里。
一个更好的方法是创建一个新类,可以将所有这些数据包含在其中,然后您可以决定使用唯一键将此数据存储在其中。因此,您的值将是一个包含整个数据块的对象。 例如,
public class MyData {
private String answerValue;
private String parentId;
private Integer instance;
private String fieldId;

//Setters and getters
...

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接