将 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 =&gt; p.Ind).ToList(); ListPairOption.ItemsSource = list;

以上是关于将 JsonObject 中的 JsonArray 显示到 ListView 中的主要内容,如果未能解决你的问题,请参考以下文章

将 JsonArray 添加到 JsonObject

json-lib中的JSONObject和JSONArray

Android中的JSONObject和JSONArray的使用

JSONArray jsonary = (JSONArray) JSONObject.parse(s); 是啥意思

jsonObject和JsonArray转化String

如何修复 JSONObject 无法转换为 JSONArray