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

时间:2015-02-09 21:21:45

标签: c# json

我的json响应显示如下。我正在使用datacontractserializer进行序列化。

如果我只需要"文字"和"创造时间"从这个Json的回应......我的DataContract应该怎么样?

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

另外,我是否需要在datacontract中为我的属性指定相同的名称(例如:screenName,文本作为属性名称?)

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

1 个答案:

答案 0 :(得分:0)

回答你的问题:

  1. 您可以省略不需要的属性,DataContractJsonSerializer会跳过它们。

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

    < / LI>
  3. 您的JSON无效,缺少外括号。我认为你的问题只是一个复制/粘贴错误。

  4. 因此,您的课程可能如下:

    [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 ?? ""));
        }
    }