将 JsonObject 中的 JsonArray 显示到 ListView 中
Posted
技术标签:
【中文标题】将 JsonObject 中的 JsonArray 显示到 ListView 中【英文标题】:Displaying JsonArray inside JsonObject into ListView 【发布时间】:2022-01-02 14:46:26 【问题描述】:我有一个如下图所示的 json:
我想把json放到一个listview中(在listview里面有一个webview来显示文本(我用蓝色圈出来的),这是按照它的索引顺序排列的(我用黑色圈出来))。
XAML:
<ListView
Name="ListPairOption"
Height="auto"
Margin="5,0,10,0">
<ListView.ItemTemplate>
<DataTemplate x:DataType="data:PairClass">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<StackPanel
x:Name="pilganStack"
Grid.Column="0"
Margin="10,10,10,10">
<WebView
x:Name="option"
MaxWidth="600"
MaxHeight="300"
Margin="5,5,5,5"
local:MyProperties.htmlString="Binding Name"/>
</StackPanel>
</ListView
代码:
string urlPath = "..../multiple/test/284/4";
var httpClient = new HttpClient(new HttpClientHandler());
httpClient.DefaultRequestHeaders.Add("Authorization", string.Format("Bearer 0", "token"));
var response = await httpClient.GetAsync(urlPath);
string jsonText = await response.Content.ReadAsStringAsync();
try
JsonObject jsonObject = JsonObject.Parse(jsonText);
JsonObject questionObject = jsonObject["EXAM_QUESTION"].GetObject();
int index = 0;
string c = "";
string v1 = "";
string choice = "";
ObservableCollection<PairClass> itemL = new ObservableCollection<PairClass>();
JsonArray mapArray = questionObject["map"].GetArray();
foreach (JsonValue mapValue in mapArray)
JsonArray mapArrayI = mapValue.GetArray();
foreach (JsonValue mapValueI in mapArrayI)
PairClass pair = new PairClass();
try
if (mapValueI.ToString().All(char.IsDigit))
c = String.Concat(mapValueI.ToString().Where(Char.IsDigit));
index = Int16.Parse(c);
pair.Ind = index;
else
string v = mapValueI.ToString();
var collection = Regex.Matches(v, "\\\"(.*?)\\\"");
foreach (var item in collection)
v1 = item.ToString().Trim('"');
choice = v1;
pair.Name = choice;
for (int i = 0; i < varian; i++)
itemL.Add(new PairClass Ind = index, Name = choice );
itemL.Add(pair);
ListPairOption.ItemsSource = itemL;
对类:
public class PairClass
public int Ind get; set;
public string Name get; set;
public PairClass()
Ind = int.MinValue;
Name = string.Empty;
Pilihan = string.Empty;
public PairClass(int ind, string name)
Ind = ind;
Name = name;
我遇到了一个问题,无法将数据显示到ListView中(只有最后一个数据在listview中重复显示),如下图:
如何处理?
【问题讨论】:
【参考方案1】:我检查了你的代码,它看起来你在错误的地方生成了PairClass
,它应该在地图项解析之前创建并在每个地图项解析之后分配值。我已经更新了下面的代码,请检查一下。
try
JsonObject jsonObject = JsonObject.Parse(jsonText);
JsonObject questionObject = jsonObject["EXAM_QUESTION"].GetObject();
int index = 0;
string c = "";
string v1 = "";
string choice = "";
ObservableCollection<PairClass> itemL = new ObservableCollection<PairClass>();
JsonArray mapArray = questionObject["map"].GetArray();
foreach (JsonValue mapValue in mapArray)
JsonArray mapArrayI = mapValue.GetArray();
PairClass pair = new PairClass();
foreach (JsonValue mapValueI in mapArrayI)
try
if (mapValueI.ToString().All(char.IsDigit))
c = String.Concat(mapValueI.ToString().Where(Char.IsDigit));
index = Int16.Parse(c);
pair.Ind = index;
else
string v = mapValueI.ToString();
var collection = Regex.Matches(v, "\\\"(.*?)\\\"");
foreach (var item in collection)
v1 = item.ToString().Trim('"');
choice = v1;
pair.Name = choice;
catch
itemL.Add(pair);
ListPairOption.ItemsSource = itemL;
catch
【讨论】:
要在listview上显示“pair.Name”成功显示,但我想根据pair.Ind显示顺序“pair.Name”(如上图我用蓝色圈出的) JSON(就像上面我用黑色圈起来的图片)) 当然,您可以根据 itemL 的 `pair.Ind` 属性订购。 当然,您可以根据 itemL 的 `pair.Ind` 属性进行订购。var list = itemL.OrderBy(p => p.Ind).ToList(); ListPairOption.ItemsSource = list;
以上是关于将 JsonObject 中的 JsonArray 显示到 ListView 中的主要内容,如果未能解决你的问题,请参考以下文章
json-lib中的JSONObject和JSONArray
Android中的JSONObject和JSONArray的使用