鉴于此JSON:
[
{
"$id": "1",
"$type": "MyAssembly.ClassA, MyAssembly",
"Email": "me@here.com",
},
{
"$id": "2",
"$type": "MyAssembly.ClassB, MyAssembly",
"Email": "me@here.com",
}
]
Run Code Online (Sandbox Code Playgroud)
和这些类:
public abstract class BaseClass
{
public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}
Run Code Online (Sandbox Code Playgroud)
如何将JSON反序列化为:
IEnumerable<BaseClass> deserialized;
Run Code Online (Sandbox Code Playgroud)
我不能使用,JsonConvert.Deserialize<IEnumerable<BaseClass>>()因为它抱怨BaseClass是抽象的.
此Imgur api调用返回一个列表,其中包含json中表示的Gallery Image和Gallery Album类.
我不知道如何使用Json.NET自动反序列化这些,因为没有$ type属性告诉反序列化器要表示哪个类.有一个名为"IsAlbum"的属性可用于区分两者.
这个问题似乎显示了一种方法,但它看起来有点像黑客.
我该如何反序列化这些类?(使用C#,Json.NET).
样本数据:
图库图片
{
"id": "OUHDm",
"title": "My most recent drawing. Spent over 100 hours.",
...
"is_album": false
}
Run Code Online (Sandbox Code Playgroud)
画廊专辑
{
"id": "lDRB2",
"title": "Imgur Office",
...
"is_album": true,
"images_count": 3,
"images": [
{
"id": "24nLu",
...
"link": "http://i.imgur.com/24nLu.jpg"
},
{
"id": "Ziz25",
...
"link": "http://i.imgur.com/Ziz25.jpg"
},
{
"id": "9tzW6",
...
"link": "http://i.imgur.com/9tzW6.jpg"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
}
我尝试从 Newtonsoft.Json 迁移到 System.Text.Json。我想反序列化抽象类。Newtonsoft.Json 为此具有 TypeNameHandling。有没有办法通过.net core 3.0 上的 System.Text.Json 反序列化抽象类?
我在我的项目中使用它是JsonConvert为了json从我的对象中创建一个字符串,但是发生了一些奇怪的事情,其中一个实体在这个过程中丢失了数据,这很奇怪,因为当我调试时,该实体具有值,但对于某些实体来说原因是它在这个过程中丢失。
我使用 JsonConvert.SerializeObject 方法,这是丢失数据的实体:
[DataContract]
public class MediaDTO : BaseEntityDTO
{
[DataMember(IsRequired = true)]
public int Id { get; set; }
[DataMember(IsRequired = true)]
public bool IsAlive { get; set; }
[DataMember(IsRequired = true)]
public string Description { get; set; }
[DataMember(IsRequired = true)]
public PidDTO Pid { get; set; }
}
[DataContract]
public class BaseEntityDTO
{
[DataMember(IsRequired = true)]
public bool IsDeleted { get; set; }
[DataMember(IsRequired = true)]
public DateTime AddedDate { get; set; …Run Code Online (Sandbox Code Playgroud) Json.Net没有将其接收到的对象反序列化为我的 Control 类的正确派生类。(请参阅以下对该问题的解释。另请注意,我认为这是解释该问题所需的最少代码量。提前感谢您审阅此问题。)
我正在尝试将以下类序列化为 JSON 或从 JSON 反序列化。
public class Page {
public Guid Id { get; set; }
public Guid CustomerId { get; set; }
public IList<Control> Controls { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是 Control 类:
public class Control : ControlBase
{
public override Enums.CsControlType CsControlType { get { return Enums.CsControlType.Base; } }
}
Run Code Online (Sandbox Code Playgroud)
这是 ControlBase 抽象类:
public abstract class ControlBase
{
public Guid Id { get; set; }
public virtual Enums.CsControlType CsControlType { get; }
public …Run Code Online (Sandbox Code Playgroud) 实体对象需要转换为字符串以将它们存储在日志文件中以供人类阅读。属性可以在运行时添加到派生实体。序列化在实体基类中定义。我尝试了下面的代码,但它也返回具有空值的属性。由于许多属性具有空值,这使得日志难以阅读。
Hoq 仅序列化非空属性?我也试过
var jsonSettings = new JsonSerializerSettings()
{
DefaultValueHandling = DefaultValueHandling.Ignore,
Formatting = Formatting.Indented,
TypeNameHandling= TypeNameHandling.All
};
return JsonConvert.SerializeObject(this, GetType(), jsonSettings);
Run Code Online (Sandbox Code Playgroud)
这仅序列化newtonsoft json 中确认的 EntityBase 类属性不会序列化派生类属性
public class EntityBase {
public string Serialize()
{
var s = new System.Web.Script.Serialization.JavaScriptSerializer();
s.Serialize(this);
}
}
public class Customer: EntityBase {
public string Name, Address;
}
Run Code Online (Sandbox Code Playgroud)
测试用例:
var cust= new Customer() { Name="Test"};
Debug.Writeline( cust.Serialize());
Run Code Online (Sandbox Code Playgroud)
观察到:结果包含“地址”:空
预期:结果不应包含地址属性。
使用 ASP.NET/Mono MVC4、.NET 4.6