【发布时间】:2020-12-04 20:26:37
【问题描述】:
我正在尝试调用外部 WebAPI,并且输入与输出具有相似的形状。我想为输入和输出重用相同类型的对象。
确实有一种简单的方法可以让请求和响应模型像下面这样在Attachments 属性中添加额外的层:
request = new { MessageText = "text", Attachments = new {Attachment = attachments }};
response = new { MessageText = "text", Attachments = attachments };
但是我很感兴趣这两个模型是否可以由单个类表示但与反序列化相比序列化为不同的模式。理想情况下寻找属性的一些属性,但对自定义转换器或其他任何东西开放。
详情:
WebAPI 的输入 json 必须是这样的:
{
"MessageText": "text",
"Attachments": {
"Attachment": [
{
"FileName": "file1"
},
{
"FileName": "file2"
}
]
}
}
但是当 WebAPI 在结果中返回相同的对象时,它会返回这个:
{
"MessageText": "text",
"Attachments": [
{
"FileName": "file1"
},
{
"FileName": "file2"
}
]
}
我不知道为什么 WebAPI 在输入中需要一个级别“附件”,并且在输出中不返回... 当然,我无法控制 WebAPI 的代码。
如何使用 C# 映射我的 DTO 类? 他们必须通过这 3 个单元测试?
[TestClass]
public class UnitTestJsonCollectionSerialisation
{
private void TestMethodDeSerialization(string json)
{
var actual = JsonConvert.DeserializeObject<Message>(json);
Assert.AreEqual(2, actual.Attachments.Count);
Assert.AreEqual("file1", actual.Attachments[0].FileName);
}
[TestMethod]
public void TestMethodDeSerialization1()
{
const string JSON1 = "{\"MessageText\":\"text\",\"Attachments\":[{\"FileName\":\"file1\"},{\"FileName\":\"file2\"}]}";
TestMethodDeSerialization(JSON1);
}
[TestMethod]
public void TestMethodDeSerialization2()
{
const string JSON2 = "{\"MessageText\":\"text\",\"Attachments\":{\"Attachment\":[{\"FileName\":\"file1\"},{\"FileName\":\"file2\"}]}}";
TestMethodDeSerialization(JSON2);
}
[TestMethod]
public void TestMethodSerialization()
{
Message message = new Message();
message.MessageText = "text";
message.Attachments.Add(new Attachment() { FileName = "file1" });
message.Attachments.Add(new Attachment() { FileName = "file2" });
string actual = JsonConvert.SerializeObject(message);
Assert.AreEqual("{\"MessageText\":\"text\",\"Attachments\":{\"Attachment\":[{\"FileName\":\"file1\"},{\"FileName\":\"file2\"}]}}", actual);
}
}
以下 DTO 类通过了第一个单元测试,但没有通过最后两个。
public class Message
{
public string MessageText { get; set; }
public Attachments Attachments { get; set; } = new Attachments();
}
public class Attachment
{
public string FileName { get; set; }
}
public class Attachments : List<Attachment> { }
我该怎么做才能让所有单元测试都变成绿色?
【问题讨论】:
标签: c# json collections json.net deserialization