我的json响应显示如下。我正在使用datacontractserializer进行序列化。
如果我只需要"文字"和"创造时间"从这个Json的回应......我的DataContract应该怎么样?
我是否需要在数据合同中包含所有这六个属性?并使用" IgnoreDataMember"作为属性?
另外,我是否需要在datacontract中为我的属性指定相同的名称(例如:screenName,文本作为属性名称?)
"abcDetails":[
{
"screenName":"my name",
"text":"tweet desc",
"createdTime":1423494304000,
"entities":{ },
"name":"abc",
"id":"123"
}]
答案 0 :(得分:0)
回答你的问题:
您可以省略不需要的属性,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;文字:&#34;推特desc&#34;
使用助手类:
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 ?? ""));
}
}