目前我仍然坚持如何将JSON数据传递给列表视图。
背景信息:软件将定期创建一个json文件,该文件可通过Web服务获得(如下所示)。该数据应解析为列表视图,用户可以在其中查看进程。
JSON在以下示例中看起来像(最多可包含30个进程)
{
"file_timestamp”: "00:00:00 AM",
"process": [{
"id": "1",
"fzg_nr": "0123",
"fzg_kz": "KHSKDNJK",
"timestamp": "03:53:25 AM"
},
{
"id": "2",
"fzg_nr": "0124",
"fzg_kz": "UFJSDK",
"timestamp": "04:53:25 AM"
},
{
"id": "3",
"fzg_nr": "0125",
"fzg_kz": "KDFJKLD",
"timestamp": "05:53:25 AM"
}
]
}
这是我的C#代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace dfg
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class JsonParsingPage : ContentPage
{
public JsonParsingPage()
{
InitializeComponent();
GetJSON();
}
public async void GetJSON()
{
try
{
var client = new System.Net.Http.HttpClient();
var response = await client.GetAsync("http://myinternaliis/xample.JSON");
string json = await response.Content.ReadAsStringAsync();
RootObject rootObject = new RootObject();
ListView listViewJson = new ListView();
if (json != "")
{
rootObject = JsonConvert.DeserializeObject<RootObject>(json);
}
listViewJson.ItemsSource = rootObject.processes;
Content = listViewJson;
}
catch (InvalidCastException e)
{
throw e;
}
ProgressLoader.IsVisible = false;
}
public class Process
{
public string id { get; set; }
public string fzg_nr { get; set; }
public string fzg_kz { get; set; }
public string timestamp { get; set; }
}
public class RootObject
{
public string file_timestamp { get; set; }
public List<Process> processes { get; set; }
}
}
}
XAML文件只包含progressloader。
我真的很感激任何帮助,tipps或参考。提前谢谢,保罗
编辑:我的问题是,数据没有显示在列表视图中......
答案 0 :(得分:1)
我认为问题是因为您的ListView
没有定义ItemTemplate
,所以它不知道必须显示哪些信息。
链接的屏幕截图正好说明了这一点 - 您可以查看ListView
中的“行”,但无法查看此行的任何数据。
您可以使用基本的DataTemplate
来显示已解析的JSON对象的一些属性,如下所示:
DataTemplate template = new DataTemplate(typeof(TextCell));
template.SetBinding(TextCell.TextProperty, "id");
template.SetBinding(TextCell.DetailProperty, "fzg_kz");
listViewJson.ItemTemplate = template;
答案 1 :(得分:0)
感谢目前为止的回复。感谢你们,我可以使用这个问题!
问题在于:
首先,@ Mario C Simao Jr是对的。我不得不将数据绑定到单元格,我就像他建议的那样做。方法改为:
public async void GetJSON()
{
try
{
var client = new System.Net.Http.HttpClient();
var response = await client.GetAsync("http://x.x.x.x/xample.JSON");
string json = await response.Content.ReadAsStringAsync();
RootObject rootObject = new RootObject();
ListView listViewJson = new ListView();
if (json != "")
{
rootObject = JsonConvert.DeserializeObject<RootObject>(json);
}
DataTemplate template = new DataTemplate(typeof(TextCell));
template.SetBinding(TextCell.TextProperty, "id");
template.SetBinding(TextCell.DetailProperty, "fzg_kz");
listViewJson.ItemTemplate = template;
listViewJson.ItemsSource = rootObject.process;
Content = listViewJson;
}
catch (InvalidCastException e)
{
throw e;
}
ProgressLoader.IsVisible = false;
}
但所有问题的根源是public class RootObject
。
我不得不改变它:
public class RootObject
{
public string file_timestamp { get; set; }
public List<Process> process { get; set; }
}
所以这是我自己经典的第8层错误。
非常感谢你的帮助!
真诚地,保罗