【发布时间】:2018-10-12 13:39:52
【问题描述】:
我有一个Person 类:
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string Line1 { get; set; }
public string Line2 { get; set; }
}
作为最终结果,我想将 Person 实例打印为 JSON,但我希望它是一个巨大的键值对字符串,例如:
"Name:John,Surname:Doe,Line1:Infinite Loop,Line2:California"
请注意,在上面的示例中,我去掉了实际的类名(即它打印出 Line1 而不是 Address.Line1) - 我只关心所有名称/值对。
所以最终结果将是Persons 的数组:
"persons":[
"Name:John,Surname:Doe,Line1:Infinite Loop 1,Line2:California",
"Name:Jane,Surname:Doe,Line1:Infinite Loop 2,Line2:California"
]
作为起点,我尝试使用反射:
void Main()
{
var persons = new List<Person>();
persons.Add(new Person
{
Name = "John",
Surname = "Doe",
Address = new Address
{
Line1 = "Infinite Loop",
Line2 = "California"
}
});
foreach(var person in persons)
{
var properties = new List<string>();
foreach(var property in person.GetType().GetProperties())
{
properties.Add($"{property.Name}:{property.GetValue(person, null)}");
}
Console.WriteLine(string.Join(",", properties));
}
}
但我在 LINQPad 中得到以下输出:
Name:John,Surname:Doe,Address:UserQuery+Address
我假设Address 没有正确迭代,因为它是Person 中的嵌套对象。即便如此,这看起来也不是最干净/最有效的方法。
【问题讨论】:
-
现在,您可以反映 UserQuery.Address 对象的属性以获取它们的值。也就是说,您为什么不使用“正确的”JSON 序列化,例如在 Json.NET 的帮助下? (在我看来你想重新发明轮子......)
-
@elgonzo 因为我只需要所有属性作为名称/值,由
,分隔。使用 JSON,Address将成为Person中的一个对象(即包裹在{ }中),这是我无法做到的。如果有,你能给我指出正确的方向吗? -
创建一个只包含您想要序列化的属性的新类(通常称为 DTO),将您的复杂对象映射到 DTO 的集合中,然后让内置的序列化器完成它。
-
@ChrisPickford 也许我误解了一些东西,我想基本上展平对象,因此没有层次结构/嵌套,并将所有内容打印为键值对字符串。序列化程序不会尊重嵌套(这是我不想要的)吗?
-
如果普通 JSON(反)序列化在您的场景中不可行,那么要么考虑 UserQuery.Address 对象(如我的第一条评论中所述),要么为 UserQuery.Address 配备@987654337 @覆盖,如下面的答案所示。 (但请重新考虑并验证您的假设/想法/想法/等等......这导致您得出结论,将 Peson 的 JSON 序列化为 JSON 对象对于您的用例是不可行的。毕竟,避免 JSON 序列化并构建一些自定义JSON文本表示应该有一个理由来证明你必须付出的努力......)
标签: c# .net reflection json.net