【问题标题】:How to convert complicated nested list of map into json object如何将复杂的嵌套地图列表转换为json对象
【发布时间】:2017-02-16 11:01:24
【问题描述】:
   List<Map<String, List<Map<String, Object>>>> ListMapTermMapList = new ArrayList<Map<String,List<Map<String ,Object>>>>();

输入

[
    {
        Inventories=
        [
        {FINANCIAL_BLOCK=Balance Sheet, COUNTRY_ID=8, TAXONOMY_ID=34, VALUE=279.7, COMPANY_STAGING_ID=9433, FINANCIAL_NAME=Inventories, COMPANY_CODE=LENZ, TYPE=companyFinal, COMPANY_ID=31, REPORTED_IN_FINANCIALS=Inventories, SUB_BLOCK=Current Assets, _version_=1559400052581990400}, {FINANCIAL_BLOCK=Balance Sheet, COUNTRY_ID=1, TAXONOMY_ID=34, VALUE=1122.0, COMPANY_STAGING_ID=102049, FINANCIAL_NAME=Inventories, COMPANY_CODE=APPLE, TYPE=companyFinal, COMPANY_ID=2, REPORTED_IN_FINANCIALS=Inventories, SUB_BLOCK=Current Assets, _version_=1559400052590379009}
        ]
    },  

    {
        High Performance Mixed Signal ( HPMS )=
        [
        {FINANCIAL_BLOCK=Income Statement, EXTENSION_NAME=Work performed by the Group and capitalized, COUNTRY_ID=8, TAXONOMY_ID=17602, VALUE=7.5, COMPANY_STAGING_ID=9564, FINANCIAL_NAME=Other Operating Income, COMPANY_CODE=LENZ, TYPE=companyFinal, COMPANY_ID=31, REPORTED_IN_FINANCIALS=Work performed by the Group and capitalized, SUB_BLOCK=Operating Block, _version_=1559400052606107648}, {FINANCIAL_BLOCK=Income Statement, EXTENSION_NAME=Work performed by the Group and capitalized, COUNTRY_ID=8, TAXONOMY_ID=17602, VALUE=30269.0, COMPANY_STAGING_ID=8926, FINANCIAL_NAME=Other Operating Income, COMPANY_CODE=LENZ, TYPE=companyFinal, COMPANY_ID=31, REPORTED_IN_FINANCIALS=Work performed by the Group and capitalized, SUB_BLOCK=Operating Block, _version_=1559400052663779330}
        ]
    }
]

我正在尝试使用杰克逊映射器将这个复杂的嵌套映射列表转换为 JSON 对象。

createJson(map);

转换函数为:

public static String createJson(Object obj) throws JsonGenerationException,JsonMappingException, IOException
{
    org.codehaus.jackson.map.ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper();
    SimpleDateFormat sdf = new SimpleDateFormat(DF);
    mapper.getSerializationConfig().setDateFormat(sdf);
    String json = mapper.writeValueAsString(obj);
    return json;
}

例外

org.codehaus.jackson.map.JsonMappingException: (是 java.lang.UnsupportedOperationException) (通过引用链: java.util.ArrayList[0]->java.util.HashMap["Inventories"]->java.util.ArrayList[0])

【问题讨论】:

  • 您的实际问题是什么,当前实现分别给出了什么错误? createJson(...) 返回什么,期望的输出是什么?
  • 错误是:处理程序执行导致的已解决异常:org.springframework.http.converter.HttpMessageNotWritableException:无法写入内容:(是java.lang.UnsupportedOperationException)(通过引用链:java.util .HashMap["匹配"]->java.util.ArrayList[0]->java.util.HashMap["Inventories"]->java.util.ArrayList[0]);嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.UnsupportedOperationException) (通过引用链:java.util.HashMap["matched"]->java.util.ArrayList[0]->java. util.HashMap["Inventories"]->java.util.ArrayList[0])
  • 输入看起来像对象列表,所以它应该是 List>>>>> 或者如果它映射到相应的 POJO你有一个
  • 是这样的:List>>> ListMapTermMapList = new ArrayList>>> ();
  • 你试过GSON吗?它提供了简单的toJson()fromJson() 方法来将Java 对象转换为JSON,反之亦然。

标签: java json spring spring-mvc jackson


【解决方案1】:

我认为Gson 在这种情况下会救你一命:

查看此示例以了解如何使用它:

public static void main(String[] args)
{
    //Part 1
    Map<String ,Object> map1 = new HashMap<>();
    map1.put("FINANCIAL_BLOCK", "Balance Sheet");
    map1.put("COUNTRY_ID", 8);

    List<Map<String ,Object>> inventoriesList = new ArrayList<>();
    inventoriesList.add(map1);

    Map<String,List< Map<String ,Object> > > inventoriesMap = new HashMap<>();
    inventoriesMap.put("Inventories", inventoriesList);

    //Part 2
    Map<String ,Object> map2 = new HashMap<>();
    map2.put("FINANCIAL_BLOCK", "Income Statement");
    map2.put("COUNTRY_ID", 8);

    List<Map<String ,Object>> highPerformanceList = new ArrayList<>();
    highPerformanceList.add(map2);

    Map<String,List< Map<String ,Object> > > highPerformanceMap = new HashMap<>();
    highPerformanceMap.put("High Performance Mixed Signal ( HPMS )", highPerformanceList);

    //Collect
    List<Map<String, List<Map<String, Object>>>> ListMapTermMapList = new ArrayList< Map<String,List< Map<String ,Object> > > >();
    ListMapTermMapList.add(inventoriesMap);
    ListMapTermMapList.add(highPerformanceMap);

    //Format to Json
    System.out.println(new Gson().toJson(ListMapTermMapList));


}

输出:

[
    {
        "Inventories": [
            {
                "FINANCIAL_BLOCK": "Balance Sheet",
                "COUNTRY_ID": 8
            }
        ]
    },
    {
        "High Performance Mixed Signal ( HPMS )": [
            {
                "FINANCIAL_BLOCK": "Income Statement",
                "COUNTRY_ID": 8
            }
        ]
    }
]

【讨论】:

  • 使用 Gson 的输出是:[{"Inventories":[null,null,null,null]},{"High Performance Mixed Signal (HPMS)":[null,null,null,null ]},{"Branded":[null,null,null,null]},‌​{"Generics":[null,nu‌​ll,null,null]},{"Cas‌​h 和现金等价物":[ null,null,null,null]},{"集团":[null,null,null‌​,null]},{"标准产品":[null,null,null,null]},{"企业和其他" :[null,null,null,null]},{"其他":[]},{"总收入":[null,null,null,null]},{"注射剂":[null,null,nu‌​ ll,null]},{"应收账款净额":[null,null,null,null]}] -- 所有嵌套map都转为null
  • 你能分享你如何用数据膨胀你的 ListMapTermMapList 吗?或尝试在将其传递给 new Gson().toJson() 之前打印它 System.out.println(ListMapTermMapList ),以查看包含的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2018-03-20
  • 1970-01-01
相关资源
最近更新 更多