分配多个JsonProperties?

Sja*_*ide 14 c# serialization json

我正在尝试制作一个包含Facebook和Twitter信息的单一数据类.

但在我从Twitter id_str获得的JSON回复中,我需要从FaceBook获得id.

我需要将这两个放入id-string中.

现在我知道[JsonProperty("id_str")]如果我想将Twitters反序列id_str化为我的id-string,我可以使用它.

但是,如果我需要在我的数据类中使用相同的字符串反序列化Facebook id和Twitters id_str,该id怎么办?

Sja*_*ide 9

我想我用最简单的方式解决了......

    public string id_str { 
        get{return id;}
        set{id = id_str;}
    }

    public string id { get; set; }
Run Code Online (Sandbox Code Playgroud)

简单地添加两个并制作一个,设置另一个..它有效:P有时简单的解决方案是最好的?

  • 可以工作,但各种污染类型与所有类型的属性.其中一半从未使用,具体取决于您反序列化的JSON. (2认同)

Chr*_*ers 7

不,这是不可能的.

我们来看看Json.NET文档.特别是关于JsonPropertyAttribute类的帮助页面.

报价:

"指示JsonSerializer始终使用指定的名称序列化成员."

它在Newtonsoft.Json命名空间中声明.我们需要确定它是如何声明的.我们来看看CodeSlex上的Json.NET源代码:

http://json.codeplex.com/

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property |     
 AttributeTargets.Parameter, AllowMultiple = false)]
public sealed class JsonPropertyAttribute : Attribute
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

猜猜回答了这个问题.该属性的AllowMultiple属性设置为false.因此,您无法使用此属性多次修饰属性,字段或参数.

即使你可以如何期望Json.net找出使用哪个属性?我将分别为Twitter和Facebook创建类型,您可以将收集的JSON数据反序列化.

所以:

Twitter -> JSON -> Twitter specific types
Facebook -> JSON -> Facebook spefic types
Run Code Online (Sandbox Code Playgroud)

然后创建一个应用程序使用的抽象,而不是直接解决这些类型.它们只属于特定的社交媒体实现.

Twitter/Facebook/... speficic types - >您的类型

如果您直接尝试将数据反序列化为"常见类型",那么您将继续苦苦挣扎,因为它们不会100%与接收到的数据保持一致,并且您将最终得到一些时髦,难以维护的反序列化逻辑.

另一个选择是创建自己的自定义Json.NET转换器.

http://geekswithblogs.net/DavidHoerster/archive/2011/07/26/json.net-custom-convertersndasha-quick-tour.aspx

只需为Twitter和Facebook创建转换器,当您反序列化JSON数据时,只需指定要使用的转换器即可.

  • TwitterConverter
  • FacebookConverter

例如:

MySocialType myType = JsonConvert.DeserializeObject<Mapped>(json, 
    new TwitterConverter());
Run Code Online (Sandbox Code Playgroud)

无论如何,我会尽量避免使用反序列化逻辑本身污染您的类类型.