json.net(newtonsoft)
我正在查看文档,但我找不到任何关于这个或最好的方法来做到这一点.
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
JsonConvert.Deserialize<List<Base>>(text);
Run Code Online (Sandbox Code Playgroud)
现在我在序列化列表中有Derived对象.如何反序列化列表并返回派生类型?
我尝试从 Newtonsoft.Json 迁移到 System.Text.Json。我想反序列化抽象类。Newtonsoft.Json 为此具有 TypeNameHandling。有没有办法通过.net core 3.0 上的 System.Text.Json 反序列化抽象类?
我已经和JSON.net合作了一段时间.我已经编写了自定义转换器和自定义合同解析器(通常来自修改SO和Newtonsoft网站上的示例),它们工作正常.
除了例子之外,我面临的挑战是,我什么时候应该使用其中一个(或两个)进行处理.根据我自己的经验,我基本上已经确定合同解决方案更简单了,所以如果我可以用他们做我需要的东西,我会这样做; 否则,我使用自定义JsonConverters.但是,我进一步知道两者有时一起使用,因此概念变得更加不透明.
问题:
我试图将JSON字符串反序列化为具体类,该类继承自抽象类,但我无法使其工作.我用Google搜索并尝试了一些解决方案,但它们似乎也没有用.
这就是我现在拥有的:
abstract class AbstractClass { }
class ConcreteClass { }
public AbstractClass Decode(string jsonString)
{
JsonSerializerSettings jss = new JsonSerializerSettings();
jss.TypeNameHandling = TypeNameHandling.All;
return (AbstractClass)JsonConvert.DeserializeObject(jsonString, null, jss);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试转换生成的对象,它就不起作用.
我不使用DeserializeObject的原因是我有很多具体的类.
有什么建议?
我正在使用Json.NET进行我正在进行的项目.从外部API,我接收的JSON具有作为对象的属性,但是当它们为空时,传递"false".
例如:
data: {
supplier: {
id: 15,
name: 'TheOne'
}
}
Run Code Online (Sandbox Code Playgroud)
也可能是:
data: {
supplier: false
}
Run Code Online (Sandbox Code Playgroud)
我应该如何定义供应商属性,以便将供应商反序列化为Supplier对象或为null.
现在我有:
public class Data {
[JsonProperty("supplier")]
public SupplierData Supplier { get; set; }
}
public class SupplierData {
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是现在当供应商的值为'false'时尝试反序列化时,它会失败.当JSON值为"false"时,我希望Supplier属性为null.
我希望有人知道如何做到这一点.谢谢.
在jackson中使用for的@JsonTypeInfo和@JsonSubTypes注释是什么?
public class Lion extends Animal {
private String name;
@JsonCreator
public Lion(@JsonProperty("name") String name) {
this.name = name;
}
public String getName() {
return name;
}
public String getSound() {
return "Roar";
}
public String getType() {
return "carnivorous";
}
public boolean isEndangered() {
return true;
}
@Override
public String toString() {
return "Lion [name=" + name + ", getName()=" + getName() + ", getSound()=" + getSound() + ", getType()=" + getType() + ", isEndangered()="
+ isEndangered() + "]"; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用自定义将一些JSON反序列化为各种子类 JsonConverter
我几乎遵循了这一点.
我的抽象基类:
abstract class MenuItem
{
public String Title { get; set; }
public String Contents { get; set; }
public List<MenuItem> Submenus { get; set; }
public String Source { get; set; }
public String SourceType { get; set; }
public abstract void DisplayContents();
}
Run Code Online (Sandbox Code Playgroud)
而我的派生JsonConverter:
class MenuItemConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(MenuItem).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的JSON提要(我删除了一些这个例子不需要的字段):
{
"total_count": 2,
"num_pages": 1,
"current_page": 1,
"balance": {
"amount": "0.00001199",
"currency": "BTC"
},
"transactions": [
{
"transaction": {
"id": "5018f833f8182b129c00002f",
"created_at": "2012-08-01T02:34:43-07:00",
"sender": {
"id": "5011f33df8182b142400000e",
"name": "User Two",
"email": "user2@example.com"
},
"recipient": {
"id": "5011f33df8182b142400000a",
"name": "User One",
"email": "user1@example.com"
}
}
},
{
"transaction": {
"id": "5018f833f8182b129c00002e",
"created_at": "2012-08-01T02:36:43-07:00",
"hsh": "9d6a7d1112c3db9de5315b421a5153d71413f5f752aff75bf504b77df4e646a3",
"sender": {
"id": "5011f33df8182b142400000e",
"name": "User Two",
"email": "user2@example.com"
},
"recipient_address": "37muSN5ZrukVTvyVh3mT5Zc5ew9L9CBare"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
有两种类型的交易在这个饲料:有一个内部事务recipient有一个和外部交易hsh和recipient_address.
我创建了以下类来容纳这个结构:

因此,我们为所有分页结果( …
有没有办法以appsettings.json强类型的方式读取多态对象?下面是我需要的一个非常简化的例子。
我有多个应用程序组件,Features在此处命名。这些组件由工厂在运行时创建。我的设计意图是每个组件都由其单独的强类型选项配置。在这个例子中,FileSizeCheckerOptions和PersonCheckerOption是这些的实例。每个功能都可以使用不同的选项多次包含。
但是使用现有的 ASP.NET Core 配置系统,我无法读取多态强类型选项。如果设置是由 JSON 反序列化器读取的,我可以使用类似这样的东西。但这不是appsettings.json,其中选项只是键值对。
appsettings.json
{
"DynamicConfig":
{
"Features": [
{
"Type": "FileSizeChecker",
"Options": { "MaxFileSize": 1000 }
},
{
"Type": "PersonChecker",
"Options": {
"MinAge": 10,
"MaxAge": 99
}
},
{
"Type": "PersonChecker",
"Options": {
"MinAge": 15,
"MaxAge": 20
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
启动文件
public void ConfigureServices(IServiceCollection services)
{
services.Configure<FeaturesOptions>(Configuration.GetSection("DynamicConfig"));
ServiceProvider serviceProvider = services.BuildServiceProvider();
// try to load settings in strongly …Run Code Online (Sandbox Code Playgroud) 在json反序列化攻击中观看此视频,它显示了这一点json,可用于在任何反序列化它的应用程序上触发任意代码执行.
现在在我的应用程序中,我甚至从未使用过类型的json.我总是反序列化为动态对象或JObjects.在$type今天早上另一次无关的谈话之前,我甚至都不知道这个房产.
在我的json设置中是否有一种方法可以告诉它永远不会写或读取此属性?这不是我想要的东西.