14

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

但在我来自 twitter 的 JSON 回复中,我需要id_str并且从 FaceBook 我得到id.

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

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

但是,如果我需要将 Facebookid和 Twitter都反序列化到我的数据类id_str中的同一个字符串中怎么办?id

4

3 回答 3

9

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

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

    public string id { get; set; }

只需将两者都添加并制作一个,然后设置另一个.. 它可以工作:P 有时简单的解决方案是最好的?

于 2012-06-26T09:22:48.837 回答
8

不,这是不可能的。

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

去引用:

“指示 JsonSerializer 始终序列化具有指定名称的成员。”

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

http://json.codeplex.com/

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

猜猜这回答了这个问题。该特性的AllowMultiple属性设置为 false。所以你不能用这个属性多次装饰一个属性、字段或参数。

即使您可以期望 Json.net 确定要使用哪个属性?我会分别为 Twitter 和 Facebook 创建类型,您可以将接收到的 JSON 数据反序列化到其中。

所以:

Twitter -> JSON -> Twitter specific types
Facebook -> JSON -> Facebook spefic types

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

Twitter / Facebook / ...特定类型->您的类型

如果您直接尝试将数据反序列化为“常见类型”,那么您将继续挣扎,因为它们与接收到的数据没有 100% 对齐,您最终会遇到一些时髦、难以维护的反序列化逻辑.

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

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

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

  • 推特转换器
  • Facebook转换器

例如:

MySocialType myType = JsonConvert.DeserializeObject<Mapped>(json, 
    new TwitterConverter());

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

于 2012-06-26T08:54:03.420 回答
2

如果您正在寻找要使用的泛型类模型,您可以按如下方式进行。

public class GenericClass
{
    public virtual string ID {get;set;}
}
public class FaceBook : GenericClass
{
    [JsonProperty("id")]
    public override string ID { get => base.ID; set => base.ID = value; }
}
public class Twitter : GenericClass
{
    [JsonProperty("id_str")]
    public override string ID { get => base.ID; set => base.ID = value; }
}

对于脸书,

GenericClass genericClass = JsonConvert.DeserializeObject<FaceBook>(json);

推特,

GenericClass genericClass = JsonConvert.DeserializeObject<Twitter>(json);

你可以忘记使用什么模型类,只使用 GenericClass

于 2018-01-16T21:32:43.043 回答