我的问题是我想将一个 json 对象反序列化为一个 C# 对象,但诀窍是 C# 对象包含 List<抽象类> 并且这个抽象类是另外 10 个类的超类。
public sealed class SearchAPIResult
{
public string Status;
public SearchAPIQuery Query;
public SearchResults Result;
public SearchAPIResult()
{
}
public SearchAPIResult(string status)
{
Status = status;
}
}
Run Code Online (Sandbox Code Playgroud)
并且SearchAPIResult是:
public sealed class SearchResults
{
public string TextAnswer;
public List<APIResultWidget> Items;
public SearchResults()
{
Items = new List<APIResultWidget>();
}
}
Run Code Online (Sandbox Code Playgroud)
这里的对象APIResultWidget是一个抽象类,它继承了大约 10 个类。
问题是 JSON 对象没有自动(如 JSON.NET 中的 typeNameHandling)来引导反序列化器转换到 10 个派生类中的哪个对象。相反,对象由两个字段标记:Type 和 SubType... 如下所示
{
"Status": "OK", …Run Code Online (Sandbox Code Playgroud) 这是我从 Web 服务获得的 JSON 响应:
{
"odata.metadata": "https://graph.windows.net/00c6cd14-eaee-4d02-9807-59bcd4f98847/$metadata#domainDnsRecords",
"value": [{
"odata.type": "Microsoft.DirectoryServices.DomainDnsTxtRecord",
"dnsRecordId": "aceff52c-06a5-447f-ac5f-256ad243cc5c",
"isOptional": false,
"label": "aro3652698.applabdnstest1.com",
"recordType": "Txt",
"supportedService": "Email",
"ttl": 3600,
"text": "MS=ms14815229"
},
{
"odata.type": "Microsoft.DirectoryServices.DomainDnsMxRecord",
"dnsRecordId": "5fbde38c-0865-497f-82b1-126f596bcee9",
"isOptional": false,
"label": "aro3652698.applabdnstest1.com",
"recordType": "Mx",
"supportedService": "Email",
"ttl": 3600,
"mailExchange": "ms14815229.msv1.invalid",
"preference": 32767
}]
}
Run Code Online (Sandbox Code Playgroud)
“value”标记下数组中的元素具有不同的派生类型。
有DomainDnsRecord抽象基类,从基类继承的类是DomainDnsTxtRecord和DomainDnsMxRecord。
在给定的 JSON 数组中(但不总是!),第一个元素是 of DomainDnsTxtRecord,第二个元素是DomainDnsMxRecord类型。
包含有关给定元素是什么类型的信息的字段是:“recordType”。
将此 JSON 数组反序列化为基类列表的最简单、最方便的方法是什么,例如List<DomainDnsRecord>(例如(使用 Newtonsoft))?
TL;DR:在 json.net 中是否有一种简单的方法来检查属性的类型并基于它创建一个实例?
我在 JSON 中有以下两个对象,它们是JSON API中的关系对象:
{ "data": { "type": "Test", "id": "1" } }
Run Code Online (Sandbox Code Playgroud)
和
{ "data": [{ "type": "Test", "id": "1" }, { "type": "Test", "id": "2" }]}
Run Code Online (Sandbox Code Playgroud)
使用 json.net,我想将这些对象序列化为 ToOneRelation 或 ToManyRelation 类。这些类看起来像这样:
[JsonConverter(typeof(RelationshipConverter))]
abstract class Relation
{
[JsonProperty("meta")]
public Dictionary<string, object> Meta { get; set; }
}
class ToOneRelation : Relation
{
[JsonProperty("data")]
public object Data { get; set; }
}
class ToManyRelation : Relation
{
[JsonProperty("data")]
public List<object> Data { get; …Run Code Online (Sandbox Code Playgroud) 我需要为现有的报告接口实现远程连接,这需要数据类的序列化和反序列化。这是类和接口的简化版本:
public interface IBase
{
string Name { get; }
}
public interface IDerived1
{
int Value { get; }
}
public interface IDerived2
{
bool Value { get; }
}
public class Base : IBase
{
public string Name { get; protected set; }
}
public class Derived1 : Base, IDerived1
{
public int Value { get; protected set; }
}
public class Derived2 : Base, IDerived2
{
public bool Value { get; protected set; }
}
Run Code Online (Sandbox Code Playgroud)
作为输入参数我得到
IEnumerable<IBase> …Run Code Online (Sandbox Code Playgroud) 我有一个JSON响应,包含在外部数组中,如下所示:
[
{
"type": "a"
},
{
"type": "b",
"id": 1
},
{
"type": "c",
"name": "somename"
}
]
Run Code Online (Sandbox Code Playgroud)
我试图将此转换为对象,如下所示:
class LoginOptions
{
public IList<ILoginOption> Options { get; set; }
}
interface ILoginOption
{
[JsonProperty("type")]
LoginType LoginType { get; }
}
class LoginOptionA : ILoginOption{
public LoginType LoginType
{
get { return LoginType.A; }
}
}
class LoginOptionB : ILoginOption{
public LoginType LoginType
{
get { return LoginType.B; }
}
[JsonProperty("id")]
public int Id { get; set; }
}
class …Run Code Online (Sandbox Code Playgroud) 我正在使用动态加载程序集Assembly.LoadFrom(),然后使用它来实例化它的一些类型.CreateInstance().接下来,我将这些对象放入一个数组中,并使用json.net(配置为TypeNameHandling.Auto)将其序列化为一个文件.在文件中,我可以看到它存储了正确的类型名称,例如: -
"Features": [{
"$type": "FeaturesAssembly.SomeFeature, FeaturesAssembly",
// Other serialized properties
}]
Run Code Online (Sandbox Code Playgroud)
问题是我无法反序列化文件.Json.net抛出一个JsonSerializationException,消息"无法加载程序集'FeatureAssembly'",尽管已经动态加载了必要的程序集.我错过了什么?
我正在尝试反序列化派生类型,并且我想使用自定义属性Type来区分派生类型。
[
{
"Type": "a",
"Height": 100
},
{
"Type": "b",
"Name": "Joe"
}
]
Run Code Online (Sandbox Code Playgroud)
我找到的解决方案是创建一个自定义JsonConverter. 在ReadJson我读取Type属性并通过ToObject<T>函数实例化该类型时。一切正常,直到我使用JsonConverterAttribute. 该ReadJson方法无限循环,因为该属性也应用于子类型。
如何防止将此属性应用于子类型?
[JsonConverter(typeof(TypeSerializer))]
public abstract class Base
{
private readonly string type;
public Base(string type)
{
this.type = type;
}
public string Type { get { return type; } }
}
public class AType : Base
{
private readonly int height;
public AType(int height)
: base("a")
{
this.height = …Run Code Online (Sandbox Code Playgroud) 我想序列化派生类型,如此处所述,但对于signalR,我想实现从JsonConverter派生的自定义转换器
我将它添加到signalR中,如下所示
var serializer = GlobalHost.DependencyResolver.GetService(typeof(JsonSerializer)) as JsonSerializer;
var i = new CustomTypeConverter();
serializer.Converters.Add(i);
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);
Run Code Online (Sandbox Code Playgroud)
public override bool CanConvert(Type objectType)
我调试此函数时应该处理哪些类型我没有看到我认为是我的解决方案的一部分类型