gpt4 book ai didi

c# - 我可以将 json 解析为字符串或其他具体类型作为对象吗?

转载 作者:行者123 更新时间:2023-11-30 16:05:48 26 4
gpt4 key购买 nike

我想要 object 类型的属性,它可以是 stringTemplate 类型。

是否可以告诉 Json.NET 将某些内容解析为几种指定类型之一?

class MyClass
{
public object Template { get; set; }
}

哪里 Template = "TemplateName"

{
"Template": "TemplateName"
}

Template = new Template()

{
"Template": { "Name": "OtherTamplate", ... }
}

更新:

我尝试遵循@krillgar 的建议并创建自定义 JsonConverter 但不幸的是 CanConvert 方法仅接收目标类型,在本例中为 object。此信息不足以判断它是否可以反序列化(如果我有其他 object 属性)。我想我需要它毕竟是一个 Template 或创建一个派生类型,如 TemplateReference 或其他东西:

class myconverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override bool CanConvert(Type objectType)
{
// objectType = typeof(object)
throw new NotImplementedException();
}
}

Configuration = JsonConvert.DeserializeObject<MyClass>(text, new myconverter());

免责声明

这个问题曾经作为 How to deserialize a JSON property that can be two different data types using Json.NET 的重复问题被关闭。 .因为在写我的问题时我不知道已经有一个类似的问题我想澄清它们之间的区别以防止它在未来被关闭:

另一个问题是关于如何将不同的值反序列化为具体类型,而我的问题是关于将不同的值反序列化为对象。乍一看似乎是一样的,因为在这两个示例中只有属性的类型不同,但它对整个应用程序设计有巨大影响。对我来说重要的是,我可以使用一个对象 来存储不同的专用类型,而不是一个类型具有多个职责。

最佳答案

这个问题可以通过使用自定义 JsonConverter 来解决.这是适用于这种情况的通用版本:

class ObjectOrStringConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
// CanConvert is not called when the [JsonConverter] attribute is used
return false;
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object)
{
return token.ToObject<T>(serializer);
}
return token.ToString();
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}

要使用转换器,您需要做的就是将 [JsonConverter] 属性添加到类中的属性,该属性可以是字符串或对象。泛型类型参数必须匹配您期望的非字符串对象的类型。

class MyClass
{
[JsonConverter(typeof(ObjectOrStringConverter<Template>))]
public object Template { get; set; }
}

下面是转换器的演示:

class Program
{
static void Main(string[] args)
{
Console.WriteLine("--- first run ---");

string json = @"
{
""Template"": ""TemplateName""
}";

DeserializeAndDump(json);

Console.WriteLine("--- second run ---");

json = @"
{
""Template"": { ""Name"": ""OtherTemplate"" }
}";

DeserializeAndDump(json);
}

static void DeserializeAndDump(string json)
{
MyClass obj = JsonConvert.DeserializeObject<MyClass>(json);
if (obj.Template == null)
{
Console.WriteLine("Template property is null");
}
else
{
Console.WriteLine("Template property is a " + obj.Template.GetType().Name);

string name = "(unknown)";
if (obj.Template is Template) name = ((Template)obj.Template).Name;
else if (obj.Template is string) name = (string)obj.Template;

Console.WriteLine("Template name is \"" + name + "\"");
}
Console.WriteLine();
}
}

class Template
{
public string Name { get; set; }
}

这是上面的输出:

--- first run ---
Template property is a String
Template name is "TemplateName"

--- second run ---
Template property is a Template
Template name is "OtherTemplate"

fiddle :https://dotnetfiddle.net/Lw3RaN

关于c# - 我可以将 json 解析为字符串或其他具体类型作为对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33080843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com