【问题标题】:How to order properties with Json.NET, if a class has JsonExtensionData?如果类具有 JsonExtensionData,如何使用 Json.NET 对属性进行排序?
【发布时间】:2019-12-21 01:14:42
【问题描述】:

当前状态

举个例子:

public class Example
{
    [JsonProperty(Order = 1)]
    [JsonExtensionData]
    public JObject First { get; set; }

    [JsonProperty(Order = 2)]
    public string Second { get; set; }
}

JsonExtensionData 的属性(属性First)在Second 存在后附加到序列化对象。例如结果为:

{
    "second": "blah blah",
    "first": {
        "name": "value"
    }
}

想要的状态

{
    "first": {
        "name": "value"
    },
    "second": "blah blah"
}

[JsonProperty(Order = x)] 似乎不适用于标有JsonExtensionData 的属性。关于如何达到所需状态的任何想法?

【问题讨论】:

  • 您好,当您将对象转换为 json 对象时,您应该添加其他参数,请检查:newtonsoft.com/json/help/html/JsonPropertyOrder.htm
  • 您的观察似乎是正确的。 JsonSerializerInternalWriter.SerializeObject() 序列化属性后的扩展数据。 JsonExtensionDataAttribute 甚至没有 Order 属性。因此排序扩展数据似乎没有实现。
  • 事实上,我有点惊讶合约解析器没有尝试为您的Example 类型创建合约,因为[JsonExtensionData][JsonProperty] 冲突。 (相反,它只是假设前者取代后者。)
  • 为了得到你想要的东西,你可能需要一个自定义合约解析器 + 自定义转换器组合。值得吗?

标签: c# .net json serialization json.net


【解决方案1】:

不确定它是否可以帮助您,但您可以尝试。如果没有标记Order,则分配默认顺序-2,并且在可序列化时强制首先出现。

public class Example
{
    [JsonExtensionData]
    public JObject First { get; set; }

    [JsonProperty(Order = 2)]
    public string Second { get; set; }
}

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多