如何在将JSON响应直接反序列化为强类型对象时避免字段



我有一个json响应,如下所示。我正在使用datacontractserializer进行序列化。

如果我只需要Json回复中的"文本"one_answers"创建时间"。。。我的DataContract应该是什么样子?

我是否需要在我的数据合同中包含所有这六个属性?并使用"IgnoreDataMember"作为属性?

此外,我是否需要在数据合约中为我的属性提供相同的名称(例如:screenName,文本作为属性名称?)

"abcDetails":[  
          {  
             "screenName":"my name",
             "text":"tweet desc",
             "createdTime":1423494304000,
             "entities":{  },
             "name":"abc",
             "id":"123"
          }]

回答您的问题:

  1. 您可以省略不需要的属性,DataContractJsonSerializer将跳过这些属性。

  2. 只要将DataMemberAttribute.Name值设置为与JSON中显示的名称相同,类的属性名称就可以与JSON属性名称不同。

  3. 您的JSON无效,缺少外部大括号。我想这只是你问题中的复制/粘贴错误。

因此,您的类可能看起来像:

[DataContract]
public class Detail
{
    [DataMember(Name="text")]
    public string Text { get; set; }
    [DataMember(Name="createdTime")]
    public long CreatedTimeStamp { get; set; }
}
[DataContract]
public class RootObject
{
    [DataMember(Name="abcDetails")]
    public List<Detail> Details { get; set; }
}

测试:

        string json = @"
{
""abcDetails"":[  
          {  
             ""screenName"":""my name"",
             ""text"":""tweet desc"",
             ""createdTime"":1423494304000,
             ""entities"":{  },
             ""name"":""abc"",
             ""id"":""123""
          }]
}
";
        var response = DataContractJsonSerializerHelper.GetObject<RootObject>(json);
        foreach (var detail in response.Details)
        {
            Console.WriteLine(string.Format("Created Time: {0}; Text: "{1}"", detail.CreatedTimeStamp, detail.Text));
        }

产生输出

创建时间:1423494304000;文本:"推特描述"

使用助手类:

public static class DataContractJsonSerializerHelper
{
    public static T GetObject<T>(string json) where T : class
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        return GetObject<T>(json, serializer);
    }
    public static T GetObject<T>(string json, DataContractJsonSerializer serializer)
    {
        using (var stream = GenerateStreamFromString(json))
        {
            var obj = serializer.ReadObject(stream);
            return (T)obj;
        }
    }
    private static MemoryStream GenerateStreamFromString(string value)
    {
        return new MemoryStream(Encoding.Unicode.GetBytes(value ?? ""));
    }
}

最新更新