2017-01-07 11 views
0

ТАК, Я пытаюсь получить пользователь кормить любят за первые 25 записей, как показано ниже:Почему динамический Json не сопоставляется с моими значениями свойств класса? и почему извлеченный Json недействителен?

var access_token = HttpContext.Items["access_token"].ToString(); 
      if (!string.IsNullOrEmpty(access_token)) 
      { 
       var appsecret_proof = access_token.GenerateAppSecretProof(); 

       var fb = new FacebookClient(access_token); 

       dynamic myFeed = await fb.GetTaskAsync(
        ("me/feed?fields=likes{{name,pic_large}}") 
//GraphAPICall formats the json retrieved from facebook 
         .GraphAPICall(appsecret_proof)); 

       string feed = myFeed; 

       var postList = new List<FBAnalyseViewModel>(); 
       foreach (dynamic post in myFeed.data) 
       { 
        postList.Add(DynamicExtension.ToStatic<FBAnalyseViewModel>(post)); 
       } 

GraphAPI выше получить базовый GraphAPICall затем форматирует Json извлеченные из Facebook и добавляет appsecret_proof плюс аргументов как здесь ниже :

public static string GraphAPICall(this string baseGraphApiCall, params object[] args) 
{ 
     //returns a formatted Graph Api Call with a version prefix and appends a query string parameter containing the appsecret_proof value 
     if (!string.IsNullOrEmpty(baseGraphApiCall)) 
     { 
      if (args != null && 
       args.Count() > 0) 
      { 
       //Determine if we need to concatenate appsecret_proof query string parameter or inject it as a single query string paramter 
       string _graphApiCall = string.Empty; 
       if (baseGraphApiCall.Contains("?")) 
        _graphApiCall = string.Format(baseGraphApiCall + "&appsecret_proof={" + (args.Count() - 1) + "}", args); 
       else 
        _graphApiCall = string.Format(baseGraphApiCall + "?appsecret_proof={" + (args.Count() - 1) + "}", args); 

        //prefix with Graph API Version 
        return string.Format("v2.8/{0}", _graphApiCall); 
       } 
       else 
        throw new Exception("GraphAPICall requires at least one string parameter that contains the appsecret_proof value."); 
     } 
     else 
      return string.Empty; 
} 

Я использую метод отображения авто для моих значений свойств, как здесь ниже:

//Iterate through the dynamic Object's list of properties, looking for match from the facebook mapping lookup 
     foreach (var entry in properties) 
     { 
     var MatchedResults = PropertyLookup.Where(x => x.facebookparent == entry.Key || x.facebookfield == entry.Key); 

     if (MatchedResults != null) 
      foreach (propertycontainer DestinationPropertyInfo in MatchedResults) 
      { 
        object mappedValue =null; 
        if (entry.Value.GetType().Name == "JsonObject") 
        { 
         //drill down on level to obtain a list of properties from the child set of properties 
         //of the dynamic Object 
         mappedValue = FindMatchingChildPropertiesRecursively(entry, DestinationPropertyInfo);       

         //child properity was not matched so apply the parent FacebookJson object as the entry value 
         if (mappedValue == null && 
          DestinationPropertyInfo.facebookfield == entry.Key) 
          mappedValue = entry.Value; 

        } 
        else 
        { 
         if (String.IsNullOrEmpty(DestinationPropertyInfo.facebookparent) && 
          DestinationPropertyInfo.facebookfield == entry.Key) 
          mappedValue = entry.Value; 
        } 

        //copy mapped value into destination class property 
        if (mappedValue != null) 
         if (DestinationPropertyInfo.facebookMappedProperty.PropertyType.Name == "DateTime") 
         { 
          DestinationPropertyInfo.facebookMappedProperty.SetValue(entity, System.DateTime.Parse(mappedValue.ToString()), null); 
         } 
         else 
          DestinationPropertyInfo.facebookMappedProperty.SetValue(entity, mappedValue, null); 
      } 
    } 
    return entity; 
} 

В режиме отладки я получаю значения NULL в своих свойствах вида модели, как показано ниже. Properties with null Values А так же Json, возвращенный facebook, также недействителен json, чтобы сериализовать/десериализовать. Любое обходное решение? Помоги пожалуйста.

РЕДАКТИРОВАТЬ: Типовые значения отображаются на facebook элементов являются следующие:

[Required] 
     [FacebookMapping("likes")] 
     public dynamic Likes { get; set; } 
     [Required] 
     [FacebookMapping("name")] 
     public string Name { get; set; } 

     [FacebookMapping("pic_large")] 
     public string ImageURL { get; set; } 

EDIT2: Json извлекается из Facebook GrapAPICall, как показано ниже:

{"data":[{"id":"1264038093655465_1274837905908817","likes":{"data":[{"name":"Sayed Zubair Hashimi","pic_large":"https://scontent.xx.fbcdn.net/v/t1.0-1/p200x200/14909900_10154513795037597_3241587822245799922_n.jpg?oh=54ead7e0ba74b45b632d96da1515ccf8&oe=591C4938","id":"10154729171332597"} 

ответ

0

Как вы заметили, что Json, который вы указали, недействительны, не менее ]}}]} был пропущен. После добавления отсутствующих элементов релевантные объекты выглядят так, как показано ниже:

public class PostDetail 
{ 
    public string name { get; set; } 
    public string pic_large { get; set; } 
    public string id { get; set; } 
} 

public class Likes 
{ 
    public List<PostDetail> data { get; set; } 
} 

public class Post 
{ 
    public string id { get; set; } 
    public Likes likes { get; set; } 
} 

public class RootObject 
{ 
    public List<Post> data { get; set; } 
} 
+0

Можно ли немного пояснить, насколько я новичок в C#. Как я могу это реализовать? –

+0

Думайте, что списки действуют как обертки, чтобы дать вам дополнительные скобки из того, что я вижу. – Netferret

 Смежные вопросы

  • Нет связанных вопросов^_^