【问题标题】:Serialize array of objects as one object with a named property for each object in C# with JSON serializer使用 JSON 序列化程序在 C# 中将对象数组序列化为一个具有命名属性的对象
【发布时间】:2011-05-19 21:18:21
【问题描述】:

我有一个 List,当序列化为 JSON 时,它会给我一个对象数组。但是,我需要将序列化版本的结构如下:

{
  "item3":{
    "id":3,
    "name":"monkey"
  },
  "item4":{
    "id":4,
    "name":"turtle"
  }
}

目前,JSON 序列化的结构如下:

[
  {
    "id":3,
    "name":"monkey"
  },
  {
    "id":4,
    "name":"turtle"
  }
]

我的目标是能够通过项目 ID 而不是数字索引来引用数组(即 arr["item3"].name 而不是 arr[0].name)。

【问题讨论】:

    标签: c# arrays json serialization object


    【解决方案1】:

    对于 JaveScripySerializer,您可能只需将数据放入字典就足够了:

    var dict = list.ToDictionary(
        item => "item" + item.id);
    

    (并序列化字典)

    如果没有:

    我没有手边的电脑作为示例,但您应该能够:

    • 编写封装列表/数组的包装类
    • 使用 JavaScriptSerializer 类
    • 创建序列化程序后,将包装器类型与自定义序列化程序关联
    • 在自定义序列化程序中,迭代数据,为每个项目的字典添加一个键,即 data.Add("item"+i,list[i]);

    您通过 RegisterConverters 关联自定义地图:http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.registerconverters.aspx

    请注意,除非您也需要,否则无需编写反序列化。

    如果你卡住了,我稍后会尝试做一个广告示例。

    【讨论】:

    • 我认为这会很好。感谢您的及时回复:)
    • 好的,谢谢...在进入 RegisterConverters 业务之前,我会先试一试。谢谢马克
    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    相关资源
    最近更新 更多