You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何正确将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

火山引擎 最新活动