【问题标题】:How do I use JsonConverter with a list? [duplicate]如何将 JsonConverter 与列表一起使用? [复制]
【发布时间】:2014-06-10 01:27:12
【问题描述】:

我有一个Table

[JsonConverter(typeof(ToTableJsonConverter))]
class MyTable : Table
{}
internal class ToTableJsonConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var tables = (List<Table.Table>)value;
        var array = tables.ToArray();
        writer.WriteValue(array);
    }

}

我有一个如下所示的消息类:

class Message
{
    public List<Table.Table> Tables { get; set; }
}

错误信息:

不支持的类型:PokerServer.Table.TablePineapple。使用 JsonSerializer 类获取对象的 JSON 表示。路径 'Tables.$values'。

我可以看到错误消息,但我不知道该怎么做。最终目标是使用JsonConverter 只发送必要的属性,而无需设置所有属性。

编辑: 另外,我有一个 ContractResolver 需要检索所有属性,所以我需要一个不会阻止我的 ContractResolver 工作的解决方案。

【问题讨论】:

  • 再次阅读错误信息 - 与列表无关(这可以通过序列化 List&lt;String&gt; 来简单显示)

标签: c# json.net


【解决方案1】:

如果您的目标是只发送某些属性,您应该使用[DataContract][DataMember][IgnoreDataMember] 属性来执行此操作。

[DataContract]
class MyObject
{
    [DataMember(Name = "x")]
    public string X { get; set; }

    [DataMember(Name = "y")]
    public int Y { get; set; }

    [IgnoreDataMember]
    public double Z { get; set; }
}

现在在 List&lt;MyObject&gt; 上调用 JsonConvert.SerializeObject 会得到如下所示的内容:

[
    { "x": "apple", "y": 5 },
    { "x": "banana", "y": 8 }
]

请注意,您需要引用 System.Runtime.Serialization 程序集和命名空间。

【讨论】:

  • 如何将它与需要检索所有属性的 ContractResolver 混合使用(当我对 JSON 文件进行备份时)?
  • @user2524586 在某些情况下您想序列化所有值,而在其他情况下您只想序列化一些?
  • 没错。我有一张包含食物类型等的表格,这些表格发送给客户端(移动应用程序),在这个阶段我想尽可能少地发送,但是当我进行 JSON 备份时,我想保存并序列化所有属性和字段(我的 ContractResolver 现在可以这样做)。
  • @user2524586 我会使用我在答案中显示的内容来做到这一点,但会创建两个模型类:一个用于备份,一个用于客户端。 ContractResolver 是对如此简单的事情的重量级定制。
猜你喜欢
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 2015-12-09
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多