我正在尝试解析Json
中的一些Xamarin.Forms
我对Xamarin还是很陌生,尽管对.net而言不是
这是我简单的酒窝代码
var htc = new HttpClient();
var rsp = await htc.GetStringAsync("myurl.com");
JArray lists = JArray.Parse(rsp);
var c = lists.Count();
var l = lists.ToList();
var w=lists.Where(x => true);
即使c返回列表中正确的项目数,l和w均为空
为什么?以及如何解决?
谢谢!
PS。我真正想做的是将ListView
绑定到JArray
,但是直接看来似乎是不可能的,(Text={Binding MyPropertyName}
使应用程序崩溃)。因此,我尝试在Select
上运行JArray
以转换为KeyValuePair
。如果您有任何直接绑定的想法,那将是最好的选择!
更新
这个问题看起来更奇怪
我尝试过
var kvlist = new List<KeyValuePair<string, string>>();
foreach (JObject ll in lists)
{
kvlist.Add(new KeyValuePair<string, string>(ll["Name"].ToString(), ll["Name"].ToString()));
}
至少在这里迭代效果很好,但是kvlist在整个过程中都是null。尝试评估kvlist变量,我得到:
无法将类型为'System.RuntimeType'的对象强制转换为类型 “ Mono.Debugger.Soft.TypeMirror”。
怎么回事?
再次感谢!
答案 0 :(得分:0)
文档似乎表明JArray具有.Count属性,但没有重载方法,因为它没有实现IEnumerable,但是正如注释中所提到的,它确实实现了JToken类型(JArray是其集合),并且实现IEnumerable。 请参见JToken的以下文档:https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JToken.htm 和JArray分别为: https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JArray.htm
首选机制是创建一个强类型,然后运行.ToObject();。 您可以访问JArray.ChildrenTokens,这可能会有帮助
答案 1 :(得分:0)
您不应该直接以.ToList
类型的object
调用JArray
,而是应该以所需类型的Select
List
来调用。例如。
var l = lists.Select(c => new MyList
{
Item1 = c.Value<int>("ItemName1"),
Item2 = c.Value<string>("ItemName2")
}).ToList(); //Replce MyList with your class name
在第二种情况下,w
是null
,在获取列表l
之后,您需要根据所使用的where
子句指定属性。例如。
var w=l.Where(x =>x.isAdmin==true); //l is list you selected above
希望它能对您有所帮助。
答案 2 :(得分:0)
解决方案:
您可以使用下面的代码将JArray
转换为list<T>
:
List<T> t =lists.ToObject<List<T>>();
引用:https://www.newtonsoft.com/json/help/html/ToObjectType.htm
您还可以使用JsonConvert.DeserializeObject
将其直接转换为所需的类型。您必须先定义一个jsonModel
结构,与您的json
相同。
List<jsonModel> modelList = JsonConvert.DeserializeObject<List<jsonModel>>(jsonStr);
引用:https://www.newtonsoft.com/json/help/html/SerializingCollections.htm