相关疑难解决方法(0)

Json.net序列化/反序列化派生类型?

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对象.如何反序列化列表并返回派生类型?

c# serialization json json.net

84
推荐指数
4
解决办法
9万
查看次数

使用json.net反序列化没有类型信息的多态json类

Imgur api调用返回一个列表,其中包含json中表示的Gallery ImageGallery 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)

}

c# serialization json.net imgur

66
推荐指数
2
解决办法
3万
查看次数

将JSON反序列化为抽象类

我试图将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的原因是我有很多具体的类.

有什么建议?

  • 我正在使用Newtonsoft.Json

c# serialization json json.net

35
推荐指数
4
解决办法
3万
查看次数

Newtonsoft Json中的TypeNameHandling警告

这个链接上,在备注部分提到了" TypeNameHandling".在什么情况下,如果使用序列化/反序列化来自外部源的JSON会有害SerializationBinder?一个工作的例子将不胜感激.

c# serialization json.net

20
推荐指数
2
解决办法
7842
查看次数

外部json因为Json.Net TypeNameHandling auto而易受攻击?

我正在运营一个小型网站,用户可以上传JSON中定义的自定义"对象".最近我了解了使用JSON进行自动类型反序列化的可能威胁:JSON问题.我想我理解了问题,但我必须要求确定.如果我只使用给定的特定类型(此处MyObject)反序列化传入的JSON,JsonConvert.DeserializeObject<MyObject>(json, settings);并且内部MyObject没有类型,并且没有类型的任何成员的子MyObject类型,System.Object或者dynamic没有什么可以变坏,对吧?

TypeNameHandlingsettings设置为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.Objectdynamic类型字段,obj我可以重现威胁.但是我想要知道的是:即使MyObject是一个非常复杂的对象,有很多(派生的)子对象,但是没有准备好的user-json我也是安全的,但是它们中没有一个是或者有一个System.Object或一个动态字段(也是不是喜欢的东西List<Object>)?例如,我可以想象,$type即使没有MyObject找到相应的字段,Json.NET 也会像创建对象那样做.

c# json.net

11
推荐指数
1
解决办法
3248
查看次数

是否有一种简单的方法可以在 System.Text.Json 的自定义转换器中手动序列化/反序列化子对象?

注意:我正在使用 Microsoft 的新产品System.Text.JsonJson.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)

c# json system.text.json

7
推荐指数
1
解决办法
3277
查看次数

System.Text.Json 和动态解析多态对象

我不相信我正在考虑如何在解析 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)

c# .net-core-3.1 system.text.json

7
推荐指数
1
解决办法
4337
查看次数

System.Text.Json.JsonElement ToObject解决方法

我想知道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")转换为字符串,然后反序列化该字符串。但是我觉得这可能不是最有效的方法,而且我真的找不到以其他方式进行操作的文档。

c# .net-core-3.0 system.text.json

5
推荐指数
4
解决办法
335
查看次数

为什么 System.Text Json Serialiser 不会序列化这个通用属性,但 Json.NET 会?

我有以下情况。我已经将问题简化为以下示例,尽管我的实际情况更复杂。

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)

c# json.net .net-core system.text.json

5
推荐指数
1
解决办法
3890
查看次数

反序列化具有混合值 System.Text.JSON 的 JSON 数组

我正在尝试创建一个在 .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)

c# inheritance json system.text.json

5
推荐指数
1
解决办法
8854
查看次数