c# - 使用递归和反射的 JSON 序列化。(数组问题)
问题描述
我目前正在尝试制作自己的 JSON 序列化方法,但是当我调用像这样调用的“序列化”方法时,我遇到了数组问题:
string person = MyJsonConverter.Serialize(new Clerk("Alexander", 1999, new List<string> { "Computer Science", "Web Developer" }));
Console.WriteLine(person);
产生以下内容:
{"Skills": ["Capacity": "4", "Count": "2"], "Name": "Alexander", "YearOfBirth": "1999"}
但应该产生这个:
{"Skills": ["Computer Science", "Web Developer"], "Name": "Alexander", "YearOfBirth": "1999"}
我需要帮助的有问题的方法是,我不完全确定我做错了什么,但由于某种原因,它需要数组的属性而不是数组的值。
public static string Serialize(object obj)
{
StringBuilder stringBuilder = new StringBuilder();
IEnumerable<PropertyInfo> properties = obj.GetType().GetProperties().Where(p => p.GetIndexParameters().Length == 0);
if (typeof(IEnumerable).IsAssignableFrom(obj.GetType()))
stringBuilder.Append($"[");
else
stringBuilder.Append($"{{");
foreach (var property in properties)
if (property.PropertyType.IsPrimitive || property.PropertyType == typeof(string))
stringBuilder.Append($"\"{property.Name}\": \"{property.GetValue(obj)}\", ");
else
stringBuilder.Append($"\"{property.Name}\": {Serialize(property.GetValue(obj))}, ");
string temp = stringBuilder.ToString().Trim().Remove(stringBuilder.ToString().Length - 2);
stringBuilder.Clear();
stringBuilder.Append(temp);
if (typeof(IEnumerable).IsAssignableFrom(obj.GetType()))
stringBuilder.Append($"]");
else
stringBuilder.Append($"}}");
return stringBuilder.ToString();
}
非常感谢所有帮助。
解决方案
我通过这样做解决了它:
public static string Serialize(object obj)
{
StringBuilder stringBuilder = new StringBuilder();
IEnumerable<PropertyInfo> properties = obj.GetType().GetProperties();
if (!obj.GetType().IsPrimitive && obj.GetType() != typeof(string))
{
bool isArray = typeof(IEnumerable).IsAssignableFrom(obj.GetType()) ? true : false;
if (isArray)
stringBuilder.Append($"[");
else
stringBuilder.Append($"{{");
if (!isArray)
foreach (var property in properties)
if (property.PropertyType.IsPrimitive || property.PropertyType == typeof(string))
stringBuilder.Append($"\"{property.Name}\": \"{property.GetValue(obj)}\", ");
else
stringBuilder.Append($"\"{property.Name}\": {Serialize(property.GetValue(obj))}, ");
else
foreach (var i in obj as IEnumerable)
if (i.GetType().IsPrimitive || i.GetType() == typeof(string))
stringBuilder.Append($"\"{i}\", ");
else
stringBuilder.Append($"{Serialize(i)}, ");
stringBuilder.Remove(stringBuilder.ToString().Length - 2, 2);
if (isArray)
stringBuilder.Append($"]");
else
stringBuilder.Append($"}}");
}
else
stringBuilder.Append(obj.ToString());
return stringBuilder.ToString();
}
它可能不是最漂亮的,但它确实有效。
我仍然愿意接受建议。
推荐阅读
- algorithm - 平面度测试算法实现
- django - 在 Django 中的 UpdateView 和 CreateView 之间传递数据
- json - 在 Common Lisp 中访问嵌套的 JSON 字段
- google-apis-explorer - 租户在执行 Google Explorer API 时被列入黑名单
- javascript - 为什么 0.1+0.2+0.3 不等于 0.3+0.2+0.1?
- angular - 防止 HttpClient 在 PUT、POST 和 PATCH 上读取 cookie
- sql - 获取特定 ID 的正确数据
- kubernetes - Kubernetes 删除 statefulset 会删除 pod,尽管 cascade=false
- php - 如何使用 Symfony QueryBuilder 仅检索实体 ID?
- image - 如何为多个图形制作 SVG 精灵图像?