C#中多表查询结果列表的格式转换实现问询
在C#中实现POI数据的分组与格式转换
嘿,这个需求用C#的LINQ就能轻松搞定!我们只需要先按idPoiType对原始数据分组,再把每组里的经纬度转换成坐标数组,就能得到你想要的格式。下面是具体的实现步骤和代码示例:
1. 定义对应的实体类
首先我们需要定义两个实体类,分别对应原始数据格式和目标数据格式,这样方便后续的序列化/反序列化操作:
// 对应原始JSON的实体类 public class OriginalPoi { // 注意字段名要和原始JSON中的$id完全匹配 public string $id { get; set; } public int idPoiType { get; set; } public double latPoint { get; set; } public double lngPoint { get; set; } } // 对应目标格式的实体类 public class GroupedPoi { public int idPoiType { get; set; } public List<double[]> point { get; set; } }
2. 核心分组转换逻辑
利用LINQ的GroupBy方法可以快速完成分组,再通过Select把分组数据转换成目标格式:
// 假设你已经将原始JSON反序列化为List<OriginalPoi>类型的originalList var groupedResult = originalList // 按idPoiType进行分组 .GroupBy(poi => poi.idPoiType) // 将每个分组转换为目标格式的对象 .Select(group => new GroupedPoi { idPoiType = group.Key, // 把每组中的经纬度转换成[纬度, 经度]的数组,再收集为列表 point = group.Select(poi => new double[] { poi.latPoint, poi.lngPoint }).ToList() }) .ToList();
这段代码会自动处理所有不同的idPoiType,如果原始数据中有多个类型的POI,每个类型都会生成一个独立的分组对象。
3. 完整的JSON处理示例
如果你是直接处理JSON字符串,可以结合JSON序列化库(比如Newtonsoft.Json或者System.Text.Json)完成从原始JSON到目标JSON的完整转换:
示例1:使用Newtonsoft.Json(适用于所有.NET版本)
using Newtonsoft.Json; // 原始JSON字符串 string originalJson = "[{ \"$id\": \"7\", \"idPoiType\": 43, \"latPoint\": 40.522053118634076, \"lngPoint\": -3.665313720703125 }, { \"$id\": \"8\", \"idPoiType\": 43, \"latPoint\": 40.52172689430316, \"lngPoint\": -3.6571168899536133 }]"; // 反序列化为原始数据列表 var originalList = JsonConvert.DeserializeObject<List<OriginalPoi>>(originalJson); // 执行分组转换 var groupedResult = originalList .GroupBy(poi => poi.idPoiType) .Select(group => new GroupedPoi { idPoiType = group.Key, point = group.Select(poi => new double[] { poi.latPoint, poi.lngPoint }).ToList() }) .ToList(); // 序列化为目标格式的JSON字符串(带缩进,更易读) string targetJson = JsonConvert.SerializeObject(groupedResult, Formatting.Indented); Console.WriteLine(targetJson);
示例2:使用System.Text.Json(适用于.NET Core 3.0+/.NET 5+)
using System.Text.Json; // 原始JSON字符串 string originalJson = "[{ \"$id\": \"7\", \"idPoiType\": 43, \"latPoint\": 40.522053118634076, \"lngPoint\": -3.665313720703125 }, { \"$id\": \"8\", \"idPoiType\": 43, \"latPoint\": 40.52172689430316, \"lngPoint\": -3.6571168899536133 }]"; // 反序列化为原始数据列表 var originalList = JsonSerializer.Deserialize<List<OriginalPoi>>(originalJson); // 执行分组转换 var groupedResult = originalList .GroupBy(poi => poi.idPoiType) .Select(group => new GroupedPoi { idPoiType = group.Key, point = group.Select(poi => new double[] { poi.latPoint, poi.lngPoint }).ToList() }) .ToList(); // 序列化为目标格式的JSON字符串(带缩进) var jsonOptions = new JsonSerializerOptions { WriteIndented = true }; string targetJson = JsonSerializer.Serialize(groupedResult, jsonOptions); Console.WriteLine(targetJson);
运行上述代码后,输出的JSON就是你想要的格式啦!
内容的提问来源于stack exchange,提问作者Gabriel Sule
相关产品推荐
相关产品推荐

