【发布时间】:2020-02-25 14:43:05
【问题描述】:
作为我的 web api 的一部分,我得到了以下 JSON 返回。
["{\"InputType\":17,\"EngineSubType\":4,\"Filename\":\"targetFile.csv\",\"FileExtensionType\":\".csv\",\"IsLoadFile\":true,\"LoadContextId\":4121,\"ReportingDate\":\"2019-05-31T00:00:00\",\"IsSuccess\":false}"]
我想要做的是获取Filename 旁边的值并将其分配给我的模型Filename 参数。
在我的项目中,我创建了一个单元测试来尝试获取该值,但我所做的每次尝试都失败了。
在我的测试中,我有以下 DTO 模型:
public class HangfireTestDTO
{
public string InputType { get; set; }
public string Filename { get; set; }
}
那我的文字逻辑是这样的:
[Fact]
public void TestDTO()
{
string data =
"[\"{\\\"InputType\\\":12,\\\"EngineSubType\\\":2,\\\"Filename\\\":\\\"targetFile.csv\\\",\\\"FileExtensionType\\\":\\\".csv\\\",\\\"IsLoadFile\\\":true,\\\"LoadContextId\\\":4120,\\\"ReportingDate\\\":\\\"2019-05-31T00:00:00\\\",\\\"IsSuccess\\\":false}\"]";
// fails here
var arguments = System.Text.Json.JsonSerializer.Deserialize<HangfireTestDTO>(data);
// This is wrong - ignore for now
Assert.Equal("targetFile.csv", arguments.ToString());
}
当我在测试中调试上述内容时,它会告诉我以下信息:
无法将 JSON 值转换为 MyProject.HangfireTestDTO
然后我的想法导致我通过将反序列化行修改为以下内容再次尝试:
var arguments = System.Text.Json.JsonSerializer.Deserialize<IEnumerable<HangfireTestDTO>>(data).FirstOrDefault();
但是当使用新行运行它时,我收到以下错误:
无法将 JSON 值转换为 System.Collections.Generic.List
我做错了什么?
【问题讨论】:
-
看起来像 JSON 中的 JSON。尝试解析字符串列表,并单独解析这些字符串。
-
无论生成什么 JSON,都应该尽快重组。嵌套的 JSON 基本上总是代码设计不佳的标志,并且总是在未来出现潜在的麻烦。
-
@FranzGleichmann 那是吊火。零控制
-
您接受了一个不适用于您在问题中提出的 JSON 的答案 - 这是否意味着您的 JSON 实际上不是那样的?
-
@N0xus 然后告诉负责修复他们的代码的人,在他们修复之前不要停止告诉他们
标签: c# json deserialization json-deserialization