为什么动态Json没有映射到我的类属性值?为什么检索Json无效?
问题描述:
所以,我试图检索用户养活喜欢的第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
然后格式化从Facebook获取的Json
和此处追加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;
}
在调试模式下,我在我的模型视图属性上获得了如下图所示的空值。 并且由facebook返回的
Json
也不是有效的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: 从Facebook GrapAPICall
检索的Json
是如下:
{"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"}
答
作为你注意到你提供的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; }
}
是否有可能作出一点点的解释,据我是新来的C#。我怎样才能实现这个? –
认为这些列表正在充当包装从给我看到的附加括号。 – Netferret