如何将List <object>序列化为JSON属性集(不是JSON数组)

时间:2016-07-19 18:17:14

标签: c# json

我想将List<some_object>转换为JSON。

public class some_object
{
    public string field1 {get; set;}
    public string field2 {get; set;}
}

我想序列化这个:

var somejson = new {
    some_objects = new List<some_object>() {...some items...};
}

标准序列化产生一个数组:

{
  "some_objects": [ 
    {
      "field1":"value1", 
      "field2":"value2"
    }, 
    {
      "field1":"value3", 
      "field2":"value4"
    } 
  ]
}

相反,我希望生成这样的东西(更像XML):

{
 "some_objects": 
  {
    "some_object": {"field1":"value1", "field2":"value2"},
    "some_object": {"field1":"value3", "field2":"value4"}
  }
}

有没有办法产生这个结果?

3 个答案:

答案 0 :(得分:2)

不,JSON对象属性必须是唯一的

对象的所有属性都需要不同。从概念上讲,XML表示一个对象,但标签不直接链接到属性的概念。 JSON的方法是你发布的:

{
  "some_objects": [ 
            {"field1":"value1", "field2":"value2"}, 
            {"field1":"value3", "field2":"value4"} 
  ]
}

或者,使用提供项目唯一名称的字典

如果您想为每个项目指定一个可用于访问它们的名称,您可以使用字典:

var dict = new { 
      some_objects = new Dictionary<string,some_object>(){ 
             { "a" , new some_object { field1="value1",field2="value2" } },
             { "b" , new some_object { field1="value3",field2="value4" } },
          } 
}

这将序列化为:

{
 "some_objects": 
  {
    "a": {"field1":"value1", "field2":"value2"},
    "b": {"field1":"value3", "field2":"value4"}
  }
}

答案 1 :(得分:0)

不,因为您将获得具有相同名称的对象,名为:some_object

想想......如果你能做到,你将如何引用其中一个,使用some_objects.some_object你怎么知道它是什么?

答案 2 :(得分:0)

您似乎想要存储某种元数据,特别是对象的类型,使用XML可以使用属性。您必须执行类似添加单独属性的操作:

public class some_object
{
   public string typeText { get { return GetType().ToString(); } }

   public string field1 { get; set; }
   public string field2 { get; set; }
}

理论上会产生类似于:

的JSON
{
  "some_objects": [ 
    {
      "typeText":"MyNamespace.some_object",
      "field1":"value1", 
      "field2":"value2"
    }, 
    {
      "typeText":"MyNamespace.some_object",
      "field1":"value3", 
      "field2":"value4"
    } 
  ]
}

根据您的需要,您可能希望将此元数据封装到自己的类中。