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对象.如何反序列化列表并返回派生类型?
此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)
}
我试图将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的原因是我有很多具体的类.
有什么建议?
在这个链接上,在备注部分提到了" TypeNameHandling".在什么情况下,如果使用序列化/反序列化来自外部源的JSON会有害SerializationBinder?一个工作的例子将不胜感激.
我正在运营一个小型网站,用户可以上传JSON中定义的自定义"对象".最近我了解了使用JSON进行自动类型反序列化的可能威胁:JSON问题.我想我理解了问题,但我必须要求确定.如果我只使用给定的特定类型(此处MyObject)反序列化传入的JSON,JsonConvert.DeserializeObject<MyObject>(json, settings);并且内部MyObject没有类型,并且没有类型的任何成员的子MyObject类型,System.Object或者dynamic没有什么可以变坏,对吧?
TypeNameHandling的settings设置为TypeNameHandling.Auto(我们不要质疑这个决定,它可能可以与工作None,但我想了解的问题将其设置为Auto.)
编辑:更多信息:我已经测试了前面提到的网站中的JSON:
{
"obj": {
"$type": "System.IO.FileInfo, System.IO.FileSystem",
"fileName": "rce-test.txt",
"IsReadOnly": true
}
}
Run Code Online (Sandbox Code Playgroud)
如果MyObject有一个System.Object或dynamic类型字段,obj我可以重现威胁.但是我想要知道的是:即使MyObject是一个非常复杂的对象,有很多(派生的)子对象,但是没有准备好的user-json我也是安全的,但是它们中没有一个是或者有一个System.Object或一个动态字段(也是不是喜欢的东西List<Object>)?例如,我可以想象,$type即使没有MyObject找到相应的字段,Json.NET 也会像创建对象那样做.
注意:我正在使用 Microsoft 的新产品
System.Text.Json,Json.NET因此请确保答案相应地解决了这个问题。
考虑这些简单的 POCO:
interface Vehicle {}
class Car : Vehicle {
string make { get; set; }
int numberOfDoors { get; set; }
}
class Bicycle : Vehicle {
int frontGears { get; set; }
int backGears { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
汽车可以像这样用 JSON 表示......
{
"make": "Smart",
"numberOfDoors": 2
}
Run Code Online (Sandbox Code Playgroud)
自行车可以这样表示......
{
"frontGears": 3,
"backGears": 6
}
Run Code Online (Sandbox Code Playgroud)
很直接。现在考虑这个 JSON。
[
{
"Car": {
"make": "Smart",
"numberOfDoors": 2
}
},
{
"Car": {
"make": …Run Code Online (Sandbox Code Playgroud) 我不相信我正在考虑如何在解析 json 结果时正确使用 JsonConverter 进行多态性。
在我的场景中,我的目标是 TFS 中的 Git 策略配置。策略配置:
"value": [
{
"createdBy": {
"displayName": "username",
"url": "url",
"id": "id",
"uniqueName": "user",
"imageUrl": "url"
},
"createdDate": "2020-03-21T18:17:24.3240783Z",
"isEnabled": true,
"isBlocking": true,
"isDeleted": false,
"settings": {
"minimumApproverCount": 1,
"creatorVoteCounts": false,
"allowDownvotes": false,
"resetOnSourcePush": true,
"scope": [{
"refName": "refs/heads/master",
"matchKind": "Exact",
"repositoryId": "id"
}
]
},
"_links": {
"self": {
"href": "url"
},
"policyType": {
"href": "url"
}
},
"revision": 1,
"id": 974,
"url": "url",
"type": {
"id": "id",
"url": "url", …Run Code Online (Sandbox Code Playgroud) 我想知道ToObject<>()Json.NET中System.Text.Json 的等效方法。
使用Json.NET,您可以使用任何JToken一个并将其转换为类。例如:
var str = ""; // some json string
var jObj = JObject.Parse(str);
var myClass = jObj["SomeProperty"].ToObject<SomeClass>();
Run Code Online (Sandbox Code Playgroud)
.NET Core 3的新功能我们将如何做到这一点 System.Text.Json
var str = ""; // some json string
var jDoc = JsonDocument.Parse(str);
var myClass = jDoc.RootElement.GetProperty("SomeProperty"). <-- now what??
Run Code Online (Sandbox Code Playgroud)
最初,我以为只是将JsonElement返回的内容jDoc.RootElement.GetPRoperty("SomeProperty")转换为字符串,然后反序列化该字符串。但是我觉得这可能不是最有效的方法,而且我真的找不到以其他方式进行操作的文档。
我有以下情况。我已经将问题简化为以下示例,尽管我的实际情况更复杂。
System.Text.Json不会完全序列化对象,但Newtonsoft Json.NET会。
假设我有以下类结构。
public class A
{
public string AProperty { get; set; } = "A";
}
public class A<T> : A where T : class, new()
{
public T TObject { get; set; } = new T();
}
public class B
{
public string BProperty { get; set; } = "B";
}
public class B<T> : B where T : class, new()
{
public T TObject { get; set; } = new T();
}
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个在 .net core 3.1 中呈现的页面,该页面基于 JSON 呈现页面。
如何反序列化本文末尾的 JSON?
我尝试反序列化它,但它不起作用,因为我丢失了每个组件的数据,因为 Page 类有一个List<Component>- 但我需要它是不同组件的列表。
页面模型:
public class Page
{
public int id { get; set; }
public string pagename { get; set; }
public string metatitle { get; set; }
public string metadescription { get; set; }
public string created_at { get; set; }
public string updated_at { get; set; }
public List<Component> components { get; set; }
}
public class Pages
{
public List<Page> pages { get; set; …Run Code Online (Sandbox Code Playgroud)