2015-02-09 54 views
-2

我有一個json響應顯示如下。我正在使用datacontractserializer進行序列化。如何在將JSON響應直接反序列化爲強類型對象時避免字段?

如果我只需要這個Json響應中的「文本」和「創建時間」......我的DataContract應該如何?

我需要在我的數據合同中擁有所有這六個屬性嗎?並使用「IgnoreDataMember」作爲屬性?

而且,我需要爲我datacontract性質給予相同的名稱(例如:屏幕名,文本屬性名)

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

只是不聲明在類中你不需要的屬性。順便說一句:你不需要在這裏問。試試看。 – EZI 2015-02-09 21:25:38

+0

放棄它們,夥計們。認爲這裏有語言障礙。 – CrazyPaste 2015-02-09 21:34:06

+0

@CrazyPaste是的,它是c#........ – EZI 2015-02-09 21:34:39

回答

0

回答您的問題:

  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 ?? "")); 
    } 
} 
相關問題