小编dbc*_*dbc的帖子

.NET 核心 3:JsonPropertyName 的序列化顺序 (System.Text.Json.Serialization)

在迁移到 .NET Core 3 时,我已从 Newtonsoft.Json 序列化切换到 System.Text.Json.Serialization。在我想继续使用 JsonPropertyName 属性的所有功能中。

Newtonsoft 版本允许对序列化属性进行排序

[JsonProperty(Order = 1)]
public bool Deleted { get; set; }

[JsonProperty(Order = 2)]
public DateTime DeletedDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

有没有办法在 System.Text.Json.Serialization 中实现相同的目标?

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

12
推荐指数
2
解决办法
5634
查看次数

使用枚举数组反序列化 json

使用枚举:

namespace AppGlobals
{
    [JsonConverter(typeof(JsonStringEnumConverter))]
    public enum BoardSymbols
    {
        [EnumMember(Value = "X")]
        First = 'X',
        [EnumMember(Value = "O")]
        Second = 'O',
        [EnumMember(Value = "?")]
        EMPTY = '?'
    }
}
Run Code Online (Sandbox Code Playgroud)

我想为我的 api 定义一个模型:

using System;
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
using Newtonsoft.Json;

namespace Assignment_1
{
    public class MyRequest
    {
//...
        [Required]
        [MinLength(9)]
        [MaxLength(9)]
        [JsonProperty("changeTypes", ItemConverterType = typeof(JsonStringEnumConverter))]
        public AppGlobals.BoardSymbols[] GameBoard { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

哪里GameBoard应该序列化为 JSON 作为字符串数组,其名称由EnumMember属性指定。这种方法改编自Deserialize json character as enumeration。然而,它不起作用。如果我将枚举更改为:

    [JsonConverter(typeof(JsonStringEnumConverter))]
    public enum …
Run Code Online (Sandbox Code Playgroud)

c# asp.net json.net asp.net-core-webapi asp.net-core-3.1

12
推荐指数
1
解决办法
1万
查看次数

.net6 api 中的 DateOnly Json 转换

tl;dr: 如何将 DateOnly JsonConverter 添加到 .net6 Web api 的应用程序配置中?

我有一个带有 DateOnly 属性的对象,我正在从控制器返回它。当我提出请求时,出现错误“不支持‘System.DateOnly’实例的序列化和反序列化”。

我了解 .net6 中 DateOnly 和 TimeOnly 的反/序列化存在限制(https://github.com/dotnet/runtime/issues/53539),并且我遵循了自定义 JsonConverter 的推荐使用。然而,我遇到的问题是初始化转换器的位置。

我尝试在网络应用程序生成器中添加转换器......


builder.Services
    .AddControllers()
    .AddJsonOptions(options => options.JsonSerializerOptions.Converters.Add(new DateOnlyConverter()));
Run Code Online (Sandbox Code Playgroud)

但没有运气。

然后我尝试专门配置它

builder.Services.Configure<JsonSerializerOptions>(options =>
    options.Converters.Add(new DateOnlyConverter()));
Run Code Online (Sandbox Code Playgroud)

那里也没有运气。

所以我尝试从控制器返回 Results.Json 并在 options 中使用转换器Results.Json(status, options)。即使这样也行不通。

不过,有效的方法是将属性直接添加到属性中

[property: JsonConverter(typeof(DateOnlyConverter))]
    DateOnly DateOrdered,
Run Code Online (Sandbox Code Playgroud)

我宁愿不必将此属性添加到 DateOnly 的每次使用中,而且我真的不清楚当转换器被配置为 WebApplication 的一部分时,是什么阻止了转换器被调用。我在 .net5 应用程序中做过类似的事情,并假设 IHostBuilder 和 WebApplicationBuilder 之间的一些细微差别可能导致该问题。

编辑:可能值得注意的是我正在使用新的最小 api。但即使是 Microsoft 也指出 Json 序列化可以在此处的文档中进行配置。该文档显示的语法与常用的语法略有不同,builder.Services.Configure<JsonOptions>所以我认为这可能就是问题所在。也许最小的 api 的配置处理方式不同。但事实并非如此。至少,使用最小 api 文档中的建议配置并没有解决问题。

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

12
推荐指数
1
解决办法
1万
查看次数

外部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的JsonConverter等效项

我开始将.net Core 3.0应用程序中的一些代码从迁移Newtonsoft.JsonSystem.Text.Json

我从迁移了属性

[JsonProperty("id")][JsonPropertyName("id")]

但是我有一些属性装饰有如下JsonConverter属性:

[JsonConverter(typeof(DateTimeConverter))] [JsonPropertyName("birth_date")] DateTime BirthDate{ get; set; }

但是我在System.Text.Json“ 牛顿软件”转换器中找不到与之等效的东西。有人知道如何在.net Core 3.0中实现吗?

谢谢!

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

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

如何使用 System.Text.Json 库在现有 json 中添加属性?

       {
          "TestData":{
              "Year__of__Account":"2019",
              "Tax___x0025_":"0.06",
              "Buildings__1":"1000",
              "Contents__1":"400",
              "Total_Insurable_Value":"100",
              "Buildings__Prem":"2560.8",
              "Contents__Prem":"1707.2",
              "YB__1":"1950",
              "No__Buildings":"55",
              "Location_Sprinklers_YN":"No",
              "test":"test"
           }
        }
Run Code Online (Sandbox Code Playgroud)

在上面的示例 JSON 中,我想在属性“TestData”中添加一个名为“Name”且值为“John”的属性。如何使用 .net Core 3.0 System.Text.Json 库实现这一点。

我曾尝试使用 Utf8JsonWriter 的方法,但它正在创建一个新的 JSON 对象,而不是将其附加到上述现有的 JSON。

        using (MemoryStream memoryStream1 = new MemoryStream())
        {
            using (Utf8JsonWriter utf8JsonWriter1 = new Utf8JsonWriter(memoryStream1))
            {
                using (JsonDocument jsonDocument = JsonDocument.Parse(json))
                {
                    utf8JsonWriter1.WriteStartObject();
                    utf8JsonWriter1.WritePropertyName("Name");
                    utf8JsonWriter1.WriteStringValue("John");
                    utf8JsonWriter1.WriteEndObject();

                    // how can I add above properties to JsonDocument object??
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

11
推荐指数
2
解决办法
7513
查看次数

System.Text.Json 中 Newtonsoft.Json's / Json.Net's JsonProperty 字段的等价物是什么?

我想知道JsonPropertySystem.Text.Json 中Newtonsoft.Json/Json.Net字段的等效项是什么。

例子:

using Newtonsoft.Json;

public class Example
{
    [JsonProperty("test2")]
    public string Test { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

参考:

c# json json.net system.text.json

11
推荐指数
2
解决办法
1450
查看次数

在命名空间中找不到 System.Text.Json.JsonReaderException

我正在将 .NET Framework 4.5 项目转换为 .NET Core 3.1。我的测试过去使用 Newtonsoft.Json 来检查 json 是否有效,现在我想使用内置的 System.Text.Json 来实现相同的功能。看起来

JsonElement values = JsonDocument.Parse(json).RootElement;
Run Code Online (Sandbox Code Playgroud)

throws System.Text.Json.JsonReaderException,但我无法捕获它,因为指向此异常会导致错误

命名空间“System.Text.Json”中不存在类型或命名空间名称“JsonReaderException”(您是否缺少程序集引用?)

我只是想了解如何可能抛出实际上似乎不存在的东西。

更新#1:堆栈跟踪:

   at System.Text.Json.ThrowHelper.ThrowJsonReaderException(Utf8JsonReader& json, ExceptionResource resource, Byte nextByte, ReadOnlySpan`1 bytes)
   at System.Text.Json.Utf8JsonReader.ReadSingleSegment()
   at System.Text.Json.Utf8JsonReader.Read()
   at System.Text.Json.JsonDocument.Parse(ReadOnlySpan`1 utf8JsonSpan, Utf8JsonReader reader, MetadataDb& database, StackRowStack& stack)
   at System.Text.Json.JsonDocument.Parse(ReadOnlyMemory`1 utf8Json, JsonReaderOptions readerOptions, Byte[] extraRentedBytes)
   at System.Text.Json.JsonDocument.Parse(ReadOnlyMemory`1 json, JsonDocumentOptions options)
   at System.Text.Json.JsonDocument.Parse(String json, JsonDocumentOptions options)
   at Anonymized..ctor(String json) in Anonymized.cs:line 182
   at Anonymized.<>c__DisplayClass12_0.<TestCreateLogEntryFromJson_IllegalValues>b__0() in Anonymized.cs:line 206
   at NUnit.Framework.Assert.Throws(IResolveConstraint expression, TestDelegate code, String …
Run Code Online (Sandbox Code Playgroud)

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

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

自定义元素名称使用基元列表上的DataContractSerializer

我对使用DataContractSerializer使用基元列表时设置自定义元素名称的最佳方法感兴趣.假设我有以下类,其中包含一个字符串列表作为DataMember.

[DataContract]
public class ClassName
{
    [DataMember]
    public List<String> FieldName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,此序列化为以下内容:

<ClassName xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <FieldName xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:string>Value 1</a:string>
    <a:string>Value 2</a:string>
    <a:string>Value 3</a:string>
  </FieldName>
</ClassName>
Run Code Online (Sandbox Code Playgroud)

我想让XML尽可能简单地通过XSLT进行转换,所以理想情况下我会将标签重命名为更有用的东西,比如Value.

一种可能的解决方案是创建一个扩展Collection的类,并为CollectionDataMember参数设置ItemName,我在这里找到它.我想知道是否有办法实现相同的目标,而不需要这个额外的类或其他形式的包装类.XML序列化程序使用XMLArray和XMLArrayItem参数来完成此操作,但DataContractSerializer似乎没有类似的功能.

感谢您的任何提示或想法!

c# wcf xml-serialization datacontract datacontractserializer

10
推荐指数
2
解决办法
4491
查看次数

隐藏Java继承中的字段

在类中,与超类中的字段具有相同名称的字段会隐藏超类的字段.

public class Test {

    public static void main(String[] args) {

        Father father = new Son();
        System.out.println(father.i); //why 1?
        System.out.println(father.getI());  //2
        System.out.println(father.j);  //why 10?
        System.out.println(father.getJ()); //why 10?

        System.out.println();

        Son son = new Son();
        System.out.println(son.i);  //2 
        System.out.println(son.getI()); //2
        System.out.println(son.j); //20
        System.out.println(son.getJ()); //why 10?
    }  
}

class Son extends Father {

    int i = 2;
    int j = 20;

    @Override
    public int getI() {
        return i;
    }
}

class Father {

    int i = 1;
    int j = 10;

    public int getI() …
Run Code Online (Sandbox Code Playgroud)

java polymorphism inheritance field member-hiding

10
推荐指数
1
解决办法
5328
查看次数