超全模态模型 × Harness 升级,升级解锁 ArkClaw,最新支持 DeepSeek-V4 系列与 GLM-5.1
当使用System.Text.Json反序列化object类型属性时,默认会得到JsonElement而非实际的CLR类型(如string、int),可以通过以下两种方法解决:
System.Text.Json
object
JsonElement
string
int
编写一个自定义转换器,根据JSON的Token类型将其转换为对应的CLR类型:
public class ObjectToActualTypeConverter : JsonConverter<object> { public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.TokenType switch { JsonTokenType.String => reader.GetString(), JsonTokenType.Number when reader.TryGetInt32(out int intVal) => intVal, JsonTokenType.Number when reader.TryGetInt64(out long longVal) => longVal, JsonTokenType.Number when reader.TryGetDouble(out double doubleVal) => doubleVal, JsonTokenType.True => true, JsonTokenType.False => false, JsonTokenType.Null => null, JsonTokenType.StartObject => JsonSerializer.Deserialize<Dictionary<string, object>>(ref reader, options), JsonTokenType.StartArray => JsonSerializer.Deserialize<List<object>>(ref reader, options), _ => JsonDocument.ParseValue(ref reader).RootElement.Clone() }; } public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, value.GetType(), options); } }
在反序列化时,将转换器添加到JsonSerializerOptions中:
JsonSerializerOptions
var options = new JsonSerializerOptions { Converters = { new ObjectToActualTypeConverter() }, // 可选:忽略大小写匹配属性名 PropertyNameCaseInsensitive = true }; var myObject = await JsonSerializer.DeserializeAsync<MyObject>(stream, options);
这样SomeObject会被自动转换为对应的实际类型:
SomeObject
"MyString"
123
true/false
bool
Dictionary<string, object>
List<object>
如果你的项目基于.NET 6+,可以将SomeObject的类型改为JsonNode,之后通过GetValue<T>()方法获取实际类型:
JsonNode
GetValue<T>()
public class MyObject { public string Name { get; set; } public JsonNode SomeObject { get; set; } }
var myObject = await JsonSerializer.DeserializeAsync<MyObject>(stream); // 获取字符串 var strValue = myObject.SomeObject.GetValue<string>(); // 获取整数 var intValue = myObject.SomeObject.GetValue<int>();
这种方式更灵活,适合需要动态处理不同类型的场景,但需要显式指定要转换的类型。
内容的提问来源于stack exchange,提问作者hwcverwe
超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起
模型再升级,30秒超长叙事, 模态参考扩容
模型自由,工具不限,最新支持 Deepseek-V4 系列、GLM-5.3 系列
超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列
大模型19元起,Al应用9.9元畅享,新人首购爆款尽享优惠