相关疑难解决方法(0)

在使用Json.net进行序列化时如何更改属性名称?

我在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的文档似乎很少.如果你有一个很好的例子,我会尝试将它添加到官方文档中.谢谢!

c# serialization json.net

415
推荐指数
3
解决办法
28万
查看次数

.NET NewtonSoft JSON将映射反序列化为不同的属性名称

我有以下从外部方收到的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)

serialization json json.net deserialization c#-4.0

271
推荐指数
5
解决办法
20万
查看次数

多个JsonProperty名称分配给单个属性

我有两种格式的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规范类的属性.

c# json json.net deserialization

32
推荐指数
1
解决办法
1万
查看次数

Json.Net在序列化期间重命名属性

我有一个我正在连接的库,我完全无法控制.使用如下属性名称格式化对象:

{"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成员,而不使用硬编码字符串值注释该属性.

serialization json json.net deserialization

5
推荐指数
0
解决办法
1万
查看次数

如何使用 Json.Net 将 JsonProperty 属性分配给 DLL 内类的属性?

我在 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修饰属性的另一个类并将属性复制到新类然后序列化。

c# json datacontract json.net

5
推荐指数
1
解决办法
4279
查看次数

Json.NET向后兼容性:编写新的属性名称,但要读取新属性或旧属性

让我们假设我喜欢这个属性,我用它来保存/加载设置:

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哪些对我的情况没有帮助.

c# serialization json json.net

5
推荐指数
0
解决办法
161
查看次数

将不同的JSON反序列化为一个类

首先; 我正在使用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作为示例).

在我的情况下,简单地将一些字符替换为其他字符是不够的.

c# serialization json

5
推荐指数
0
解决办法
130
查看次数