如何使用C#将指定格式字符串转换为预期结构的JSON字符串
问题核心原因
- 未对输入JSON中每个对象的
Synonyms字段做内容解析,仅创建了空的DTO实例填充列表,最终序列化结果自然为空 - Synonyms字段存储的是带转义引号的拼接字符串,需要额外处理才能拆分出独立的同义词项
- 使用
Assert.Same判断字符串相等逻辑错误,该方法是判断两个变量是否指向内存中的同一个对象,字符串内容相同也会判定失败
调整后的完整代码
[Fact] public void InputStrToWordAlterationsTest2() { string inputStr = @"[ { ""Synonyms"": ""\""hm\"",\""history matching\"",\""HM\"",\""History Matching\"""" }, { ""Synonyms"": ""\""risk taking\"",\""Risk Taking\"",\""RISK TAKING\"",\""risk-taking\"",\""Risk-Taking\"",\""RISK-TAKING\"""" } ]"; JArray jsonArray = JArray.Parse(inputStr); // 存储所有alterations项 var alterationItems = new List<AlterationsDTO>(); foreach (JObject item in jsonArray) { // 取出Synonyms字段的字符串值 string synonymsStr = item["Synonyms"].ToString(); // 处理转义字符串:先去掉首尾的引号,再按\",\"分割得到每个同义词 var synonymsList = synonymsStr.Trim('"') .Split(new[] { "\",\"" }, StringSplitOptions.None) .ToList(); // 生成AlterationsDTO alterationItems.Add(new AlterationsDTO(synonymsList)); } // 生成最终的根DTO var resultDto = new WordAlterationsDTO(alterationItems); // 序列化时设置格式对齐预期输出,也可以用Formatting.None压缩格式 string actual = JsonConvert.SerializeObject(resultDto, Formatting.Indented); // 预期字符串统一转成双引号格式,避免单双引号不一致导致判定失败 string expected = @"{ ""wordAlterations"": [ { ""alterations"": [ ""hm"", ""history matching"", ""HM"", ""History Matching"" ] }, { ""alterations"": [ ""risk taking"", ""Risk Taking"", ""RISK TAKING"", ""risk-taking"", ""Risk-Taking"", ""RISK-TAKING"" ] } ] }"; // 用Equal判断字符串内容相等 Assert.Equal(expected, actual); }
补充说明
如果你的模型类的构造函数没有实际给属性赋值,需要检查构造函数逻辑,确保传入的列表参数确实赋值给了对应的Alterations和WordAlterations属性,避免序列化时属性为空。
内容的提问来源于stack exchange,提问作者Wilson Lee
相关产品推荐
相关产品推荐

