如何正确将JSON字符串反序列化为List<Map<String, Object>>?
JSON反序列化为List<Map<String, Object>>的实现方案
嘿,我来帮你搞定这个JSON反序列化的问题!不管你用的是Java、Python还是C#,这两种不同字段格式的JSON都能轻松转成List<Map<String, Object>>,核心思路都是先解析外层的JSON对象,提取出rows字段对应的数组,再转成目标类型。下面给你具体的实现方案:
Java 实现(使用Jackson库)
Jackson是Java生态中最常用的JSON处理库,先确保你已经引入了依赖(比如Maven):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 用最新稳定版即可 --> </dependency>
然后编写反序列化代码:
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; import java.util.Map; public class JsonDeserializer { public static void main(String[] args) throws Exception { // 两种格式的JSON字符串示例 String json1 = "{\"rows\":[{\"ProfileID\":\"SLappE\",\"CR_ProfileID\":\"BC1A\"},{\"ProfileID\":\"SCRA\",\"CR_ProfileID\":\"BC15\"},{\"ProfileID\":\"SMOKE\",\"CR_ProfileID\":\"BC15\"},{\"ProfileID\":\"Smokey\",\"CR_ProfileID\":\"BC1F\"},{\"ProfileID\":\"WF-LN-OCR\",\"CR_ProfileID\":\"BC1F\"}]}"; String json2 = "{\"rows\":[{\"PARAM\":\"product_reference_nr\",\"FIELDNAME\":\"account_nr\",\"EXAMPLE-FIELD\":\"CHK\",\"EXAMPLE-TABLE\":\"CHK_DOC\",\"ID\":\"CHK-ACCT\"},{\"PARAM\":\"party_pd_nr\",\"FIELDNAME\":\"front_image_object_id\"}]}"; ObjectMapper objectMapper = new ObjectMapper(); // 反序列化第一个JSON Map<String, Object> resultMap1 = objectMapper.readValue(json1, new TypeReference<Map<String, Object>>() {}); List<Map<String, Object>> rowsList1 = (List<Map<String, Object>>) resultMap1.get("rows"); // 反序列化第二个JSON Map<String, Object> resultMap2 = objectMapper.readValue(json2, new TypeReference<Map<String, Object>>() {}); List<Map<String, Object>> rowsList2 = (List<Map<String, Object>>) resultMap2.get("rows"); // 验证输出 rowsList1.forEach(row -> System.out.println("Row from JSON1: " + row)); rowsList2.forEach(row -> System.out.println("Row from JSON2: " + row)); } }
说明:使用TypeReference可以避免Java泛型类型擦除的问题,确保解析出来的rows数组能正确转换成List<Map<String, Object>>,不管数组里的对象字段是什么样的都能兼容。
Python 实现(使用内置json模块)
Python自带的json模块就能轻松搞定,不需要额外安装依赖:
import json # 两种格式的JSON字符串示例 json1 = '{"rows":[{"ProfileID":"SLappE","CR_ProfileID":"BC1A"},{"ProfileID":"SCRA","CR_ProfileID":"BC15"},{"ProfileID":"SMOKE","CR_ProfileID":"BC15"},{"ProfileID":"Smokey","CR_ProfileID":"BC1F"},{"ProfileID":"WF-LN-OCR","CR_ProfileID":"BC1F"}]}' json2 = '{"rows":[{"PARAM":"product_reference_nr","FIELDNAME":"account_nr","EXAMPLE-FIELD":"CHK","EXAMPLE-TABLE":"CHK_DOC","ID":"CHK-ACCT"},{"PARAM":"party_pd_nr","FIELDNAME":"front_image_object_id"}]}' # 反序列化第一个JSON result_dict1 = json.loads(json1) rows_list1 = result_dict1["rows"] # 反序列化第二个JSON result_dict2 = json.loads(json2) rows_list2 = result_dict2["rows"] # 验证输出 for row in rows_list1: print(f"Row from JSON1: {row}") for row in rows_list2: print(f"Row from JSON2: {row}")
说明:json.loads()会直接把JSON字符串转换成Python的字典,rows对应的就是一个列表,列表里的每个元素都是字典,正好对应List<Map<String, Object>>的结构,完全兼容两种不同的字段格式。
C# 实现(使用Json.NET库)
如果是用C#开发,Json.NET(Newtonsoft.Json)是首选的JSON处理库,先通过NuGet安装Newtonsoft.Json包,然后编写代码:
using Newtonsoft.Json; using System.Collections.Generic; class Program { static void Main() { string json1 = @"{""rows"":[{""ProfileID"":""SLappE"",""CR_ProfileID"":""BC1A""},{""ProfileID"":""SCRA"",""CR_ProfileID"":""BC15""},{""ProfileID"":""SMOKE"",""CR_ProfileID"":""BC15""},{""ProfileID"":""Smokey"",""CR_ProfileID"":""BC1F""},{""ProfileID"":""WF-LN-OCR"",""CR_ProfileID"":""BC1F""}]}"; string json2 = @"{""rows"":[{""PARAM"":""product_reference_nr"",""FIELDNAME"":""account_nr"",""EXAMPLE-FIELD"":""CHK"",""EXAMPLE-TABLE"":""CHK_DOC"",""ID"":""CHK-ACCT""},{""PARAM"":""party_pd_nr"",""FIELDNAME"":""front_image_object_id""}]}"; var result1 = JsonConvert.DeserializeObject<Dictionary<string, object>>(json1); List<Dictionary<string, object>> rowsList1 = (List<Dictionary<string, object>>)result1["rows"]; var result2 = JsonConvert.DeserializeObject<Dictionary<string, object>>(json2); List<Dictionary<string, object>> rowsList2 = (List<Dictionary<string, object>>)result2["rows"]; foreach (var row in rowsList1) { System.Console.WriteLine($"Row from JSON1: {JsonConvert.SerializeObject(row)}"); } foreach (var row in rowsList2) { System.Console.WriteLine($"Row from JSON2: {JsonConvert.SerializeObject(row)}"); } } }
说明:JsonConvert.DeserializeObject<Dictionary<string, object>>()解析外层JSON对象,然后提取rows字段转换成List<Dictionary<string, object>>,完美适配两种不同的JSON格式。
内容的提问来源于stack exchange,提问作者SoftwareSavant




