反序列化JSON列表,数据契约必须拥有JSON拥有的所有成员

本文关键字:拥有 JSON 成员 列表 数据 契约 反序列化 | 更新日期: 2023-09-27 18:10:14

嘿,伙计们,我正试图从API反序列化JSON响应,然后显示数据。我以字符串的形式得到响应,并试图将其映射到一个对象。这是twitter的一个响应,它用多个tweet来响应,所以我试图将它映射到tweet列表。

我收到以下异常。

System.InvalidOperationException: Type 'Default3+TwitterApiData' is not supported for deserialization of an array. at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList& convertedList) at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input) at Default3.Page_Load(Object sender, EventArgs e)

这可能是因为我在JSON中没有每个键值对的数据成员吗?返回的JSON大约是60 KV对,我不需要所有的数据,所以我只有两个成员。

或者我在反序列化到对象数组时是否有潜在的错误?下面是我做反序列化的代码。

提前感谢您的帮助。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resourceUrl);
request.Headers.Add("Authorization", authorizationHeader);
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
        try
        {
            WebResponse response = request.GetResponse();
            var responseData = new StreamReader(response.GetResponseStream()).ReadToEnd();
            TwitterApiData twitterApiResponse = new JavaScriptSerializer().Deserialize<TwitterApiData>(responseData);
            foreach (var item in twitterApiResponse.data)
            {
                lblResponse.InnerText = "created_at: " + item.created_at + " text: " + item.text;
            }
        }
        catch (Exception ex)
        {
            lblResponse.InnerText = ex.ToString();
        }

那么我要映射到的对象。也看看这个我需要[DataContract]和[DataMember]属性吗?

public class TwitterApiData
{
    public List<Tweet> data { get; set; }
}
public class Tweet
{
    public string created_at { get; set; }
    public string text { get; set; }
}

反序列化JSON列表,数据契约必须拥有JSON拥有的所有成员

    TwitterApiData data = new JavaScriptSerializer().Deserialize<TwitterApiData>(strContent);

我明白了,我不需要包装对象。我只是把它反序列化成推特列表。

var twitterApiResponse = new JavaScriptSerializer().Deserialize<List<Tweet>>(responseData);

排序。