SerializationException:从命名空间''期望的结束元素'caption'

时间:2012-08-21 13:29:29

标签: c# json deserialization

我正在尝试反序列化json字符串,并且在调用

时收到错误End element 'caption' from namespace '' expected. Found element 'created_time' from namespace ''.
InstagramObject test = (InstagramObject) instagramObject.ReadObject(instagramWebResponse.GetResponseStream());

来自Instagram的json返回了许多元素,但只有少数我需要。我的DataContract将在下面发布。

基本上我需要{data:[{caption: string, link: string, images: {...}}]}

以下是json的一个例子......

{
"data": [{
    "comments": {
        "data": [],
        "count": 0
    },
    "caption": {
        "created_time": "1296710352",
        "text": "Inside le truc #foodtruck",
        "from": {
            "username": "kevin",
            "full_name": "Kevin Systrom",
            "type": "user",
            "id": "3"
        },
        "id": "26621408"
    },
    "likes": {
        "count": 15,
        "data": [{
            "username": "mikeyk",
            "full_name": "Mike Krieger",
            "id": "4",
            "profile_picture": "..."
        }, {...subset of likers...}]
    },
    "link": "http://instagr.am/p/BWrVZ/",
    "user": {
        "username": "kevin",
        "profile_picture": "http://distillery.s3.amazonaws.com/profiles/profile_3_75sq_1295574122.jpg",
        "id": "3"
    },
    "created_time": "1296710327",
    "images": {
        "low_resolution": {
            "url": "http://distillery.s3.amazonaws.com/media/2011/02/02/6ea7baea55774c5e81e7e3e1f6e791a7_6.jpg",
            "width": 306,
            "height": 306
        },
        "thumbnail": {
            "url": "http://distillery.s3.amazonaws.com/media/2011/02/02/6ea7baea55774c5e81e7e3e1f6e791a7_5.jpg",
            "width": 150,
            "height": 150
        },
        "standard_resolution": {
            "url": "http://distillery.s3.amazonaws.com/media/2011/02/02/6ea7baea55774c5e81e7e3e1f6e791a7_7.jpg",
            "width": 612,
            "height": 612
        }
    },
    "type": "image",
    "filter": "Earlybird",
    "tags": ["foodtruck"],
    "id": "22721881",
    "location": {
        "latitude": 37.778720183610183,
        "longitude": -122.3962783813477,
        "id": "520640",
        "street_address": "",
        "name": "Le Truc"
    }
}]
} 

这是我的DataContract ......

[DataContract]
public class InstagramObject {

    [DataMember(Name = "data")]
    public IEnumerable<InstagramData> instagramData { get; set; }

}

[DataContract]
public class InstagramData {

    [DataMember(Name = "images")]
    public List<InstagramImage> instagramImages { get; set; }

    [DataMember(Name = "caption")]
    public string caption { get; set; }

    [DataMember(Name = "link")]
    public string link { get; set; }

}

[DataContract]
public class InstagramImage {

    [DataMember(Name = "low_resolution")]
    public InstagramImageInfo lowResolutionImage { get; set; }

    [DataMember(Name = "thumbnail")]
    public InstagramImageInfo thumbnail { get; set; }

    [DataMember(Name = "standard_resolution")]
    public InstagramImageInfo standardResolution { get; set; }

}

[DataContract]
public class InstagramImageInfo {

    [DataMember(Name = "url")]
    public string url { get; set; }

    [DataMember(Name = "width")]
    public int width { get; set; }

    [DataMember(Name = "height")]
    public int height { get; set; }

}

2 个答案:

答案 0 :(得分:1)

在数据协定caption中声明为字符串,但在JSON caption中是一个包含各种字段的记录 - caption应声明为具有兼容结构的对象:

[DataContract]  
public class InstagramCaption {

   [DataMember(Name = "text")]
   public string Text {get; set;}

} 

. . . 

  [DataMember(Name = "caption")]     
  public InstagramCaption caption { get; set; }     

. . . 

答案 1 :(得分:-1)

无需声明这些条款如果您想使用Json.Net + Linq

var obj = (JObject)JsonConvert.DeserializeObject(json);
var result = obj["data"]
    .Select(x => new {
        Caption = (string)x["caption"]["text"],
        Link = (string)x["link"],
        Images = x["images"].Children()
                            .Select(y=>(string)y.First()["url"]).ToArray()
    })
    .ToArray();