C# 使用Json.net序列化时,如何更改属性名?

C# 使用Json.net序列化时,如何更改属性名?,c#,serialization,json.net,C#,Serialization,Json.net,我在C#DataSet对象中有一些数据。我现在可以使用Json.net转换器将其序列化,如下所示 DataSet data = new DataSet(); // do some work here to populate 'data' string output = JsonConvert.SerializeObject(data); 但是,在打印到.json文件时,这将使用data中的属性名称。我希望将属性名称更改为不同的名称(例如,将'foo'更改为'bar') 在中的“序列化和反序列化

我在C#DataSet对象中有一些数据。我现在可以使用Json.net转换器将其序列化,如下所示

DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);
但是,在打印到.json文件时,这将使用
data
中的属性名称。我希望将属性名称更改为不同的名称(例如,将'foo'更改为'bar')

在中的“序列化和反序列化JSON”下→ 'Serialization Attributes“它说“JsonPropertyAttribute…允许自定义名称”。但没有一个例子有人知道如何使用JsonPropertyAttribute将属性名称更改为其他名称吗?

()

Json.net的文档似乎很少。如果你有一个很好的例子,我会尝试把它添加到官方文档中。
谢谢

您可以使用
[JsonProperty]
属性装饰您希望控制其名称的属性,该属性允许您指定不同的名称:

using Newtonsoft.Json;
// ...

[JsonProperty(PropertyName = "FooBar")]
public string Foo { get; set; }

文档:如果您无权访问类来更改属性,或者不希望始终使用相同的重命名属性,也可以通过创建自定义解析程序来完成重命名

例如,如果您有一个名为
MyCustomObject
的类,该类有一个名为
LongPropertyName
的属性,则可以使用如下自定义解析器

public class CustomDataContractResolver : DefaultContractResolver
{
  public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();

  protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
  {
    var property = base.CreateProperty(member, memberSerialization);
    if (property.DeclaringType == typeof(MyCustomObject))
    {
      if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
      {
        property.PropertyName = "Short";
      }
    }
    return property;
  }
}
然后调用序列化并提供解析器:

 var result = JsonConvert.SerializeObject(myCustomObjectInstance,
                new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });
结果将被缩短为{“Short”:“prop value”},而不是{“LongPropertyName”:“prop value”}


关于自定义解析程序的更多信息还有另一种方法,即使用特定的解析程序,可以通过使用
[JSonObject]
[JsonProperty]
对类或属性进行修饰,将其应用于类或属性

有一些预定义的命名策略,如
CamelCaseNamingStrategy
,但您可以实现自己的命名策略


这里可以找到不同命名策略的实现:

这是否需要我将数据读入我创建的自定义对象而不是数据集?@culix,是的,它确实需要使用模型。数据集是一种弱类型结构,因此谈论它的属性名称不是很合乎逻辑。简而言之,你也可以做
[JsonProperty(“FooBar”)]
@DarinDimitrov没有Json.NET有什么方法可以做到这一点吗?不过使用模型很简单,只需取一个Json样本并使用“Paste Special”将其粘贴到一个空的.cs文件中即可->“将JSON粘贴为类”。--它内置于Visual Studio中从这里开始,您基本上只需要将内容设置为title case/rename stuff,以使用.NET命名约定等(前者使用title case转换器,后者使用JsonProperty属性)。仅供参考,下面的文档中有一个例子。不确定是在什么时候添加的。如果要序列化的类是在另一个包含不同版本的Newtonsoft.Json包的程序集中声明的,那么这是一个更好的解决方案。(它甚至可能不会抛出任何错误)。
DefaultContractResolver
必须放在使用JsonConvert.Serialize()方法的同一程序集中。我使用的是一个供应商的API,它有一个由多个API函数使用的公共对象。仅在一个API调用中,公共对象上的一个属性必须序列化为稍有不同的名称(例如clientid与client_id)。这个答案是我问题的完美解决方案。如果你能,请分享一个自定义NamingStrategy实现的示例当然。。。不您应该自己完成,但我会抽出时间告诉您,您只需继承现有的类实现,就可以看到现有的类实现,并创建自己的类实现。谢谢-我应该更新我的评论:事实上,由于GitHub的荣耀,您可以使用Newtonsoft自己的实现作为示例,例如,@JotaBe,这不是stackoverflow的精神。坦率地说,作为一个只想完成我的工作的程序员,如果我能提升您可能提供的代码,那会好上千倍。你也会得到我的选票。我有18年的编码经验,在c#中被TripleByte评为“专家”。并非每个问题都需要留给“读者练习”。有时候我们只是想做好本职工作,继续前进。我同意你的观点,我通常不会写这种评论。但是,我可以保证,在这种情况下,查看链接代码比我给出的任何解释都要好。而json.net是一个非常有文档记录的开源库。包含到实现的链接(完美示例)