c#是否有用于覆盖默认属性名称绑定的注释?

10 浏览
0 Comments

c#是否有用于覆盖默认属性名称绑定的注释?

我有以下的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"

}

}

]

}

我的映射类如下:

public class TeamScore
{
    public string eightyMinScore { get; set; }
    public string homeOrAway { get; set; }
    public string score { get; set; }
    public string teamId { get; set; }
}
public class Team
{
    public string v1 { get; set; }
    public TeamScore teamScore { get; set; }
}
public class RootObject
{
    public List team { get; set; }
}

问题是我不喜欢Attributes这个类的名称和Team类中attributes字段的名称。我希望它的名称是TeamScore,并且移除字段名中的_,并给予适当的名称。

JsonConvert.DeserializeObject(jsonText);

我可以将Attributes重命名为TeamScore,但是如果我改变字段名(Team类中的attributes),它将无法正确反序列化并返回null。我该如何克服这个问题?

0
0 Comments

在这段代码中,作者想要在反序列化时使用JsonProperty属性,而在序列化时忽略JsonProperty属性。为了实现这个目的,作者创建了一个名为IgnoreJsonPropertyResolver的类,继承自DefaultContractResolver,重写了ResolvePropertyName方法来解析属性名。在构造函数中,作者使用ReflectionHelper和AttributeHelper来获取属性列表和属性的属性。最后,作者使用这个IgnoreJsonPropertyResolver类来序列化一个名为PlanViewModel的模型。

然而,有一个用户提到这个解决方案只适用于顶级属性,而不适用于嵌套类型。这个用户给出了另一种解决方案,即重写ContractResolver的CreateProperty方法来忽略所有的JsonProperty属性。在重写的CreateProperty方法中,首先调用基类的CreateProperty方法,然后设置jsonProperty.PropertyName为memberInfo.Name,最后返回jsonProperty。

对于那些询问ReflectionHelper和AttributeHelper是什么的用户,这是一些帮助类,用于获取属性列表和属性的属性。

希望对你有所帮助!

0
0 Comments

在这段文字中,有人提出了一个关于C#的问题:是否有一种注解可以覆盖默认的属性名称绑定。这个问题的出现原因是希望使用动态映射,而不想在模型中使用属性,他们提供了一个解决方法。

解决方法是创建一个自定义的ContractResolver类,继承自DefaultContractResolver类。在该类中,有一个属性映射的字典,用来指定属性的映射关系。在ResolvePropertyName方法中,会根据属性名在字典中查找对应的映射关系,如果找到则返回映射后的属性名,否则调用父类的ResolvePropertyName方法。

这个解决方法被认为是最好的设计,因为它避免了在模型中使用属性,提供了更好的架构设计。但是也有人提出了一些问题,比如是否支持嵌套属性的映射,是否有办法忽略某些属性。对于这些问题,可以根据实际需求进行相应的修改和扩展,比如重写"createContract"方法来处理嵌套属性的映射,或者在属性上使用[JsonProperty]注解来忽略某些属性。

总之,通过自定义ContractResolver类,可以实现对属性名称的自定义映射,从而解决了不想在模型中使用属性的需求。这种解决方法避免了使用属性带来的代码冗余,并且提供了更好的架构设计。

0
0 Comments

在这段内容中,有人问道是否有一种注解可以重写默认的属性名称绑定。问题的原因是他希望在接口中使用两个JsonProperty属性来对应两个不同的属性名称。他希望在从API读取数据并将其反序列化为模型后,能够将模型作为操作的结果发送。他想知道是否有一种方法可以在反序列化时使用一个属性名称(比如foo_bar),但在序列化时使用另一个名称(比如foo)。

解决方法是使用Json.NET库的JsonPropertyAttribute。他们提供了一个JsonProperty属性,可以用来指定JSON属性的名称。通过在模型的属性上添加[JsonProperty("属性名称")],可以将属性与JSON中的属性进行绑定。这样,就可以在反序列化和序列化过程中使用不同的属性名称。

以下是一个示例代码,展示了如何使用JsonPropertyAttribute来实现这一功能:

public class TeamScore
{
    [JsonProperty("eighty_min_score")]
    public string EightyMinScore { get; set; }
    [JsonProperty("home_or_away")]
    public string HomeOrAway { get; set; }
    [JsonProperty("score")]
    public string Score { get; set; }
    [JsonProperty("team_id")]
    public string TeamId { get; set; }
}
public class Team
{
    public string v1 { get; set; }
    [JsonProperty("attributes")]
    public TeamScore TeamScores { get; set; }
}
public class RootObject
{
    public List Team { get; set; }
}

通过在属性上添加[JsonProperty("属性名称")],可以将属性与JSON中的属性名称进行绑定。在上述示例中,属性"eighty_min_score"与EightyMinScore进行绑定,属性"home_or_away"与HomeOrAway进行绑定,以此类推。

通过使用JsonPropertyAttribute,可以实现反序列化和序列化过程中使用不同的属性名称,解决了问题。

更多关于JsonPropertyAttribute的文档可以在Newtonsoft官方网站上找到:Serialization Attributes。

需要注意的是,这个问题的回答与提问者所提到的库不一致。提问者询问的是如何在Newtonsoft库中实现这一功能,而回答者提供的是Json.NET库中的解决方案。然而,根据其他回答者的说明,Newtonsoft和Json.NET是同一个库,只是名称不同。

0