我有一个json响应,如下所示。我正在使用datacontractserializer进行序列化。
如果我只需要Json回复中的"文本"one_answers"创建时间"。。。我的DataContract应该是什么样子?
我是否需要在我的数据合同中包含所有这六个属性?并使用"IgnoreDataMember"作为属性?
此外,我是否需要在数据合约中为我的属性提供相同的名称(例如:screenName,文本作为属性名称?)
"abcDetails":[
{
"screenName":"my name",
"text":"tweet desc",
"createdTime":1423494304000,
"entities":{ },
"name":"abc",
"id":"123"
}]
回答您的问题:
-
您可以省略不需要的属性,
DataContractJsonSerializer
将跳过这些属性。 -
只要将
DataMemberAttribute.Name
值设置为与JSON中显示的名称相同,类的属性名称就可以与JSON属性名称不同。 -
您的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 ?? ""));
}
}