使用C# 反射编写一个object转 json字符串的方法,要求不使用第三方类库
时间: 2024-10-17 18:07:09 浏览: 27
在C#中,反射可以帮助我们在运行时动态地获取类型信息并创建、操作对象。以下是一个简单的示例,演示如何使用反射将`object`转换为JSON字符串,不使用第三方类库:
```csharp
using System;
using System.Text;
public class JsonHelper
{
private static readonly Type objectType = typeof(object);
public static string ObjectToJson(object obj)
{
if (obj == null)
return "{}";
StringBuilder jsonString = new StringBuilder();
jsonString.Append("{");
// 获取对象的所有公共属性
foreach (PropertyInfo prop in objectType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
try
{
// 检查属性是否为非null值并且可序列化
object value = prop.GetValue(obj, null);
if (value != null && !JsonIsNotSerializable(prop.PropertyType))
{
jsonString.Append(prop.Name).Append(": ").Append(JsonConvert.SerializeObject(value)).Append(",");
}
}
catch (Exception ex)
{
Console.WriteLine($"Failed to serialize property '{prop.Name}': {ex.Message}");
}
}
// 移除最后一个逗号
jsonString.Length--;
jsonString.Append("}");
return jsonString.ToString();
}
private static bool JsonIsNotSerializable(Type type)
{
// 这里仅检查一些常见的不可序列化的类型,实际应用中可能需要更全面的判断
switch (type)
{
case typeof(DateTime):
case typeof(TimeSpan):
return true;
default:
return false;
}
}
}
// 示例用法
class Program
{
public static void Main()
{
var testObject = new TestClass { Name = "John", Age = 30 };
string json = JsonHelper.ObjectToJson(testObject);
Console.WriteLine(json);
}
}
class TestClass
{
public string Name { get; set; }
public int Age { get; set; }
}
```
在这个例子中,我们首先获取`object`类型的公共属性,并尝试获取每个属性的值。如果属性是非`null`且其类型是可以序列化的,我们就将其转换为JSON字符串添加到结果中。
注意这只是一个基础版本,实际使用时可能需要处理更多复杂情况,例如嵌套对象、循环引用等。此外,`System.Text.Json`库已经被推荐用于序列化和反序列化,如果没有特别要求,可以考虑使用它。
阅读全文