我在C#DataSet对象中有一些数据.我现在可以使用像这样的Json.net转换器来序列化它
DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);
Run Code Online (Sandbox Code Playgroud)
但是,这会data在打印到.json文件时使用属性名称.我想将属性名称更改为不同的名称(例如,将'foo'更改为'bar').
在Json.net文档中,在"序列化和反序列化JSON"→"序列化属性"下,它表示"JsonPropertyAttribute ...允许自定义名称".但没有例子.有谁知道如何使用JsonPropertyAttribute将属性名称更改为其他名称?
(直接链接到文档)
Json.net的文档似乎很少.如果你有一个很好的例子,我会尝试将它添加到官方文档中.谢谢!
我有以下从外部方收到的JSON字符串.
{
"team":[
{
"v1":"",
"attributes":{
"eighty_min_score":"",
"home_or_away":"home",
"score":"22",
"team_id":"500"
}
},
{
"v1":"",
"attributes":{
"eighty_min_score":"",
"home_or_away":"away",
"score":"30",
"team_id":"600"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的映射类:
public class Attributes
{
public string eighty_min_score { get; set; }
public string home_or_away { get; set; }
public string score { get; set; }
public string team_id { get; set; }
}
public class Team
{
public string v1 { get; set; }
public Attributes attributes { get; set; }
}
public class RootObject
{ …Run Code Online (Sandbox Code Playgroud) 我有两种格式的JSON,我想反序列化为一个类.我知道我们不能将两个[JsonProperty]属性应用于一个属性.
你能告诉我一个实现这个目标的方法吗?
string json1 = @"
{
'field1': '123456789012345',
'specifications': {
'name1': 'HFE'
}
}";
string json2 = @"
{
'field1': '123456789012345',
'specifications': {
'name2': 'HFE'
}
}";
public class Specifications
{
[JsonProperty("name1")]
public string CodeModel { get; set; }
}
public class ClassToDeserialize
{
[JsonProperty("field1")]
public string Vin { get; set; }
[JsonProperty("specification")]
public Specifications Specifications { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望name1并且name2两者都要反序列化为name1规范类的属性.
我有一个我正在连接的库,我完全无法控制.使用如下属性名称格式化对象:
{"my property": "my value"}
Run Code Online (Sandbox Code Playgroud)
和
{"my-property": "my value"}
Run Code Online (Sandbox Code Playgroud)
使用json.net我可以在类中的属性中添加一个属性来表示每个消息,以将这些属性名称映射到我的类中的属性:
public class MyClass
{
[JsonProperty(PropertyName="my-prop")]
public String MyProperty {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
这很好,但问题是我必须在大量的类上使用这些"魔术字符串"而且我真的很鄙视魔术字符串.
底线:
有没有办法将所有这些属性更改为C#可读字符串,以便让json.net自动映射这些属性?
即:
{"my property": "my value"}
Run Code Online (Sandbox Code Playgroud)
应改为:
{"MyProperty": "my value"}
Run Code Online (Sandbox Code Playgroud)
在反序列化期间,然后将该值传递给MyClass中的MyProperty成员,而不使用硬编码字符串值注释该属性.
我在 DLL 中有一个类,它没有用DataContract, JsonProperty等标记。现在我想将该类的实例序列化为 JSON 对象,并缩短 C# 属性名称。
例如,类是:
public class Foo
{
public string SomeLengthyCSharpPropertyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以在 C# 名称和 json 名称之间创建映射。我不能直接添加如下
DataContract, JsonProperty属性。有什么解决方法吗?
[DataContract]
public class Foo
{
[JsonProperty("s")]
public string SomeLengthyCSharpPropertyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我倾向于不创建具有相同但JsonProperty修饰属性的另一个类并将属性复制到新类然后序列化。
让我们假设我喜欢这个属性,我用它来保存/加载设置:
public Options RectangleCaptureOptions { get; set; }
Run Code Online (Sandbox Code Playgroud)
我想更改属性名称RegionCaptureOptions而不是RectangleCaptureOptions.但是,如果我更改属性名称,那么Json .NET将无法找到它反序列化.
这里接受的答案不起作用:
.NET NewtonSoft JSON将映射反序列化为不同的属性名称
因为如果我使用JsonProperty:
[JsonProperty("RectangleCaptureOptions")]
public Options RegionCaptureOptions { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后它还将序列化属性,因为RectangleCaptureOptions它是旧名称.
因此,当我更改变量或属性的名称时,仍然希望在反序列化时(RegionCaptureOptions或者RectangleCaptureOptions对于此示例)支持它们的旧命名,但在序列化(RegionCaptureOptions)时使用当前名称.这样,我可以在加载(反序列化)它们时为我的设置json文件提供向后兼容性支持.
我认为最干净的解决方案是制作自定义属性JsonAlternativeName,如下所示:
[JsonAlternativeName("RectangleCaptureOptions")]
public Options RegionCaptureOptions { get; set; }
Run Code Online (Sandbox Code Playgroud)
可选地,它可以具有多个参数支持,这样您可以添加多个替代名称.
但不确定如何完成它(或者根本不可能)并且无法在StackOverflow中找到类似的解决方案,因为在我发现的每个问题中,人们建议使用JsonProperty哪些对我的情况没有帮助.
首先; 我正在使用Newtonsoft.Json将JSON反序列化为这样的对象:
JSON:
[{"number":22041}]
Run Code Online (Sandbox Code Playgroud)
订单对象
[JsonProperty("number")]
public string OrderNumber { get; set; }
Run Code Online (Sandbox Code Playgroud)
但是,根据"其他"方面的版本,Json可能会变为
[{"order_number":22041}]
Run Code Online (Sandbox Code Playgroud)
所以我实际上想要预先定义"number"和"order_number"来反序列化到我的OrderNumber中.
有没有办法实现类似下面的东西(实际上有效)
[JsonProperty("order_number")]
[JsonProperty("number")]
public string OrderNumber { get; set; }
Run Code Online (Sandbox Code Playgroud)
我可以编写另一个具有相同属性的类,但使用其他JsonProperties取决于它们所使用的版本,但这似乎是最后一次尝试的东西,除非没有可能的方法来更容易地做到这一点.
更新
我同意这个问题与上述问题重复.但是,由于JSON中的给定键发生了显着变化,因此我将制作重复的对象(OrderV1,OrderV2作为示例).
在我的情况下,简单地将一些字符替换为其他字符是不够的.