避免在json.net中序列化属性名称

问题描述 投票:-2回答:2

如何在序列化期间避免使用属性名称?下面是一个例子

public class A {      
public List<object> Values { get; set; }
public string Name { get; set; }
}

A a = new A();
a.Name = "Numbers"
a.Values = new List<object>();
a.Values.Add(1);
a.Values.Add(2);
a.Values.Add(3);
a.Values.Add(4);

JsonConvert.SerializeObject(new { a });

序列化后,结果包含属性名称“值”

{
  "a": {
    "values": [
      1,
      2,
      3,
      4
    ],
    "name": "Numbers"
  }
}

但是,我需要以下内容

{
  "a": [
      1,
      2,
      3,
      4
   ],
"name": "Numbers"
}
c# .net json.net
2个回答
1
投票

只需序列化a.Values;

JsonConvert.SerializeObject(a.Values);

1
投票

你的代码中有一些错误。

首先,如果你想要这个课:

public class A 
{      
    public List<object> Values { get; set; }
    public string Name { get; set; }
}

要序列化到这个json:

{
    "a": [
           1, 
           2, 
           3, 
           4
         ],
    "name": "Numbers"
}

你会度过一段美好的时光。只看结构,它们不是1-1。

你需要改变你的班级,确保你把它命名为有意义的东西(一个单一字母的类是一个非常糟糕的主意)。

public class SomeClass
{   
    [JsonProperty("a")]
    public List<object> Values { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}

你注意到上面的[JsonProperty()]属性?这告诉序列化程序该属性应该使用定义的名称进行序列化。这样,你可以在代码中拥有一个有意义的属性名称(“Values”),并且仍然可以按照你想要的方式(“a”)序列化json。

第二个问题是序列化时,您正在创建一个新的匿名对象,该对象具有您创建的实例类的属性。这将再次弄乱你的结构。将序列化代码更改为仅序列化对象实例:

string json = JsonConvert.SerializeObject(someInstanceOfYourClass);

我上面的更改应该给你json,如下所示:

{
    "a": [
           1, 
           2, 
           3, 
           4
         ],
    "name": "Numbers"
}

我做了一个小提琴here,将演示。

© www.soinside.com 2019 - 2024. All rights reserved.