【问题标题】:Deserializing List of JSON does the Data Contract have to have every member the JSON has?反序列化 JSON 列表 数据合约是否必须拥有 JSON 拥有的每个成员?
【发布时间】:2013-04-19 17:00:18
【问题描述】:

大家好,我正在尝试反序列化来自 API 的 JSON 响应,然后显示数据。我以字符串的形式获取响应并尝试将其映射到对象。这是来自 twitter 的回复,它回复了多条推文,所以我试图将其映射到推文列表。

我收到以下异常。

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; }
}

【问题讨论】:

    标签: c# json serialization deserialization


    【解决方案1】:
        TwitterApiData data = new JavaScriptSerializer().Deserialize<TwitterApiData>(strContent);
    

    【讨论】:

    • 您刚刚重命名了我正在使用的变量/对象?这就是我已经知道的那条线。
    【解决方案2】:

    我想通了,我不需要被包裹的对象。我只是将其反序列化为推文列表。

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

    已排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 2013-09-15
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 2012-10-06
      相关资源
      最近更新 更多