C#如何将JSON中字符串格式的Embedding转换为浮点数值数组
解决方案
报错原因
你原有代码报错是因为JSON根节点下的doc字段是嵌套对象,不是字符串类型,和你指定的反序列化目标类型Dictionary<string, string>不匹配,所以解析失败。
实现方案
这里提供两种适合初学者的实现方式,都可以直接达到你要的效果:
方案1:用JObject动态处理(无需定义实体类,适合临时处理简单JSON)
你可以直接用Newtonsoft.Json提供的JObject动态操作JSON节点,不需要提前定义数据结构:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; // 你的原始JSON字符串 string rawJson = "{\"doc\":{\"Identifier\":\"01967R0422-19990101\",\"Year\":[],\"Embedding\":\"[0.001, -0.001, 0.002]\"}}"; // 1. 把原始JSON解析为JObject对象 JObject rootObj = JObject.Parse(rawJson); // 2. 取出Embedding的字符串值 string embeddingStr = rootObj["doc"]["Embedding"].ToString(); // 3. 把字符串格式的数组反序列化为double类型数组 double[] embeddingArr = JsonConvert.DeserializeObject<double[]>(embeddingStr); // 4. 替换原Embedding字段为数组,删除不需要的Year字段 rootObj["doc"]["Embedding"] = JToken.FromObject(embeddingArr); rootObj["doc"]["Year"].Remove(); // 5. 输出处理后的JSON,Formatting.None表示不缩进,和你要的输出格式一致 string resultJson = rootObj.ToString(Formatting.None); Console.WriteLine(resultJson);
运行后输出的内容完全符合你要求的格式。
方案2:强类型实体类处理(适合项目中稳定的业务逻辑)
如果后续还要频繁操作这个JSON结构,可以定义对应实体类做强类型转换,编译阶段就能排查类型错误:
using Newtonsoft.Json; // 定义原始JSON对应的实体类 public class RawDataRoot { [JsonProperty("doc")] public RawDoc Doc { get; set; } } public class RawDoc { [JsonProperty("Identifier")] public string Identifier { get; set; } [JsonProperty("Embedding")] public string EmbeddingStr { get; set; } } // 定义输出结果对应的实体类 public class OutputDataRoot { [JsonProperty("doc")] public OutputDoc Doc { get; set; } } public class OutputDoc { [JsonProperty("Identifier")] public string Identifier { get; set; } [JsonProperty("Embedding")] public double[] Embedding { get; set; } } // 处理逻辑 string rawJson = "{\"doc\":{\"Identifier\":\"01967R0422-19990101\",\"Year\":[],\"Embedding\":\"[0.001, -0.001, 0.002]\"}}"; // 反序列化原始数据 RawDataRoot rawData = JsonConvert.DeserializeObject<RawDataRoot>(rawJson); // 转换Embedding格式 double[] embeddingArr = JsonConvert.DeserializeObject<double[]>(rawData.Doc.EmbeddingStr); // 构造输出对象 OutputDataRoot outputData = new OutputDataRoot { Doc = new OutputDoc { Identifier = rawData.Doc.Identifier, Embedding = embeddingArr } }; // 转成最终JSON string resultJson = JsonConvert.SerializeObject(outputData);
前置依赖说明
如果你的项目还未引入Newtonsoft.Json,直接在NuGet包管理器搜索Newtonsoft.Json安装即可使用。
内容的提问来源于stack exchange,提问作者bjornvandijkman
相关产品推荐
相关产品推荐

