【问题标题】:Create multidimensional json from HashMap<String, String>从 HashMap<String, String> 创建多维 json
【发布时间】:2021-09-23 12:08:29
【问题描述】:

我需要从必须从 .csv 文件生成的 hashmap 创建多维 json。 来自 csv 的 Hashmap 映射工作正常。 如果我用简单的ObjectMapper 转换创建的Hashmap,我只会得到一个具有HastMap 的所有属性的单一维度json

是否可以检查Hashmapkeys,如果键以“baseData”开头,它会进入子对象baseData,如下面的json

    {
    "testCaseData": {
        "baseData": {
            "verkaufsproduktart": "special",
            "tarifgeneration": "string",
            "ursprungAngebotsnummer": "string",
            "mandant": "string",
            "sparte": "string",
            "beratungsprotokollId": "string",
            "bonitaet": "string",
            "verkaufsname": "string",
            "aktionsnummer": "string",
            "erstellernummer": "string",
            "verkaufsprozessart": "string",
            "kanalrichtung": "string",
            "versandweg": "string",
            "vertriebskanal": "TELEFON",
            "quellsystem": "standard",
            "kundenberater": "String",
            "vsnrErgoDirekt": "string",
            "vsnrRisikotraeger": "string",
            "versicherungen": [],
            "leistungsvereinbarungen": [],
            "beitraege": [],
            "abbuchungstagImMonat": "TAG_1",
            "zahlweise": "EINMALZAHLUNG",
            "angebotsstatus": "string",
            "angebotsstatusaenderung": "date",
            "haustarif": true,
            "versicherungsBeginn": "2020-01-01",
            "rabattWert": "PROZENT_2"
        },
        "storeData": {
            "personDataStore": [{
                "adresse": {
                    "hausnummer": "string",
                    "land": "Deutschland",
                    "ort": "string",
                    "postleitzahl": "string",
                    "strasse": "string"
                }]
         }
}

testCaseDatabaseData 这样的对象名称是固定的并且是已知的。例如baseData 中的其余数据需要是通用的(这就是我使用hashmap 的原因)。

感谢您的帮助

编辑:

当前映射器

    public void getHashmapFromCsv(InputStream csvFile) throws IOException {
     HashMap<String, String> map = new HashMap<String, String>();
     BufferedReader br = new BufferedReader(new InputStreamReader(csvFile));
     List<String> completeInputList = 
 br.lines().collect(Collectors.toList());
     String[] baseLineArray = completeInputList.get(0).split(";");
     for (String singleCase : completeInputList.subList(1, 
 completeInputList.size())) {
         String[] singleCaseArray = singleCase.split(";");
         for (int i = 0; i < baseLineArray.length; i++) {
             if (i > singleCaseArray.length-1 || 
 singleCaseArray[i].equals("")) {
                 map.put(baseLineArray[i], null);
                 } else {
                     map.put(baseLineArray[i], singleCaseArray[i]);
                 }
             }
           
         }
         System.out.println(map);
         ObjectMapper Obj = new ObjectMapper().enable(SerializationFeature.WRAP_ROOT_VALUE);
         Obj.setSerializationInclusion(JsonInclude.Include.NON_NULL);
         String jsonStr = Obj.writeValueAsString(map); 

      } 
    }


{baseData_kundenberaternummer=12346798, VP3 Kdnr=null, beratungsprotokollId=BERATUNGSVERZICHT, VP3 Nachname=null, VN Postleitzahl=90344, abbuchungstagImMonat=J, telemarketingnummer=123456789, VP4 Titel=null, baseData_aktionsnummer=1000, VP4 Hausnummer=null, mandant=1, VP3 Vorname=null, VP1 Vorname=null, VP4 baseData_Kdnr=null, VP3 Titel=null, VP1 Hausnummer=null, zahlweise=QUARTALSWEISE, VN Nachname=Mustermann, versandweg=EMAIL, VP3 Hausnummer=null, VP4 Ort=null, VP4 Anrede=null, VN Anrede=HERR, tuwid=null, VP2 Nachname=null, haustarif=N, VP2 Hausnummer=null, VP3 Strasse=null, VP2 Kdnr=null, iban=DE99999999, VP1 Nachname=null, VN Vorname=Max, VN baseData_Kdnr=null, VP2 Titel=null, vertriebskanal=TELEFON, VP2 Ort=null, VN Geburtsdatum=01.01.1980, VN Titel=null, VP1 Strasse=null, VP2 Strasse=null, VN Hausnummer=60, verkaufsproduktart=standart, quellsystem=system, VP3 Ort=null, rabattWert=0, VP4 Vorname=null, Testfallname=5, VP1 Anrede=null, VP2 Anrede=null, versicherungsBeginn=0, VN Strasse=street , VP2 Vorname=null, tarife=zzz, VP1 Kdnr=null, kundencm=J, verkaufsprozessart=DIREKTABSCHLUSS, VP1 Titel=null, gespraechspartner vorname=Hans, VP1 Postleitzahl=null, VP3 Anrede=null, kontoinhaber=Max Mustermann, userId=123456789, VN gleich VP=N, VN Ort=City, VP4 Strasse=null, gespraechspartner nachname=Meyer, versandmail=test@test.com, VP1 Ort=null, VP1 Geburtsdatum=null, VP2 Postleitzahl=null, VP4 Nachname=null, bankname=Bank, VP2 Geburtsdatum=null, VP3 Geburtsdatum=null, VP4 Postleitzahl=null, bic=NORSDE51XXX, VP3 Postleitzahl=null, VP4 Geburtsdatum=null}

【问题讨论】:

  • 您能添加一下您的哈希图的样子吗?
  • 您能否向我们展示您当前解决方案的Minimal, Reproducible Example,以便我们查看输入的样子?
  • 使用当前映射器编辑。
  • 请添加您打印的地图以便更好地理解
  • 已添加。您可以在打印的地图中看到。我将一些字段命名为 baseData_*。这些值需要像上面的 json 一样放在一个名为 baseData 的子对象中

标签: java json jackson hashmap


【解决方案1】:

好的,我找到了一种方法:

首先你需要像这样设置两个(或者你需要多少个子对象)Hashmap:

HashMap&lt;String, Object&gt; testCaseData = new HashMap&lt;String, Object&gt;();

最内层的Hashmap可以是:

HashMap&lt;String, String&gt; baseData = new HashMap&lt;String, String&gt;();

然后你需要通过填写任何需要的字段来从内部 Hashmap 到外部。

baseData.put("verkaufsproduktart", "SZSSZL"); baseData.put("tarifgeneration", null);

然后将内部的Hashmaps变成外部的Hashmap

testCaseData.put("baseData", baseData);

那么你需要做的就是创建一个 Mapper 实例

ObjectWriter Obj = new ObjectMapper().enable(SerializationFeature.WRAP_ROOT_VALUE).writer().withRootName("testCaseData"); String jsonStr = Obj.writeValueAsString(testCaseData); System.out.println(jsonStr)

默认情况下,根值是“Hashmap”。如果要将其重命名为所需的名称,则需要添加:

.writer().withRootName("testCaseData"); 就像上面的例子一样。

这样就可以了。以防万一有人在搜索它:-)

【讨论】:

    【解决方案2】:

    如果您正确构建了哈希图,objectMapper 就可以完成这项工作。 如果您正确构建了哈希图,它就不可能为您提供“一维”JSON。

    检查您的 hashmap 是否构造正确,就像您给出 JSON 结果一样。

    所以从您添加的详细信息来看,您似乎只为 baseData 构建了哈希图。这就是您获得“一维”JSON 的原因。

    【讨论】:

    • 嗯,我认为我的 Hashmap 中没有错误。现在我有一个 Hashmap&lt;String, String&gt; 。我可以创建一个像Hashmap&lt;String,Hashmap&gt; 这样的Hashmap 并且仍然可以解析它吗?
    • 你可以简单地做一个 Hashmap 并且可以合并和映射所有这些。
    猜你喜欢
    • 2019-09-30
    • 2013-12-19
    • 2018-01-05
    • 2018-07-30
    • 2013-05-27
    • 2020-03-22
    • 2021-11-13
    • 1970-01-01
    • 2016-06-14
    相关资源
    最近更新 更多