【问题标题】:JSON data, simple display in xamarin formsJSON数据,以xamarin形式简单展示
【发布时间】:2021-05-10 15:42:39
【问题描述】:

您好,我有一个大的 JSON 文件,代表国家及其总病例数和新冠病毒死亡人数。我要做的就是将 JSON 的数据显示到我的 AboutPage 中。我尝试了各种方法,但没有人为我工作。知道我应该如何工作吗?

我给你一小部分 JSON

[{
  "regionData": [
    {
      "country": "World",
      "totalCases": 157341642,
      "newCases": 651328,
      "totalDeaths": 3278509,
      "newDeaths": 9126,
      "totalRecovered": 135480211,
      "activeCases": 18582922,
      "seriousCritical": 108879,
      "casesPerMil": 20185,
      "deathsPerMil": 420.6,
      "totalTests": 0,
      "testsPerMil": 0,
      "population": 0
    },
    {
      "country": "India",
      "totalCases": 21886556,
      "newCases": 401271,
      "totalDeaths": 238265,
      "newDeaths": 4194,
      "totalRecovered": 17917013,
      "activeCases": 3731278,
      "seriousCritical": 8944,
      "casesPerMil": 15729,
      "deathsPerMil": 171,
      "totalTests": 298601699,
      "testsPerMil": 214596,
      "population": 1391457000
    },  ]
}]

var assembly = typeof(AboutPage).GetTypeInfo().Assembly; 流流 = assembly.GetManifestResourceStream("MaybeThisOne.testmodel.json");

        using (var reader = new System.IO.StreamReader(stream))
        {
            var json = reader.ReadToEnd();

            List<TestModel> mylist = JsonConvert.DeserializeObject<List<TestModel>>(json);
            myrootobject = new ObservableCollection<TestModel>(mylist);
            MyListView.ItemsSource = myrootobject;

JsonConvert.DeserializeObject 在这部分我有错误说不能像方法一样使用。我试图删除括号,但没有任何反应

更新:

我执行了建议的步骤,1. 使用 json2csharp.com 创建 C# 模型,2. 使用 newtonsoft 反序列化。正在构建并且应用程序启动,但是当我尝试进入创建的页面时,它会终止应用程序而没有任何错误消息。

更新 2:

我开始了一个新项目并按照上述步骤操作。我得到的唯一错误是关于 Page3。我必须从 jsonarray 文件夹在 shell 中调用它。我该怎么做?

e.x <ShellContent Title="About" Icon="icon_about.png" Route="AboutPage" ContentTemplate="{DataTemplate local:AboutPage}" />

请你告诉我应该如何从 jsonarray 文件夹中调用 Page3?提前谢谢!!!

更新 3

我从头开始了这个项目,它部分工作。唯一的问题是它没有显示所有的绑定字段。

有什么想法吗?

enter image description here

【问题讨论】:

  • 1.使用 json2csharp.com 创建 C# 模型,2. 使用 newtonsoft 反序列化,3. 使用 CollectionView 或其他 UI 显示
  • 是的,我做了以上所有事情。
  • 请不要在 cmets 中填充代码,edit 您的问题并正确格式化以使其可读。如果你这样做了,但它不起作用,你需要描述问题。仅仅说“没有人为我工作”并不能很好地描述您遇到的问题。您是否收到错误或异常?您是否尝试过调试代码以确定问题出在哪里?请阅读How to Ask 以获得撰写主题问题的指导。
  • 对不起,我在原始问题中发布了我用来反序列化的代码。

标签: json visual-studio listview xamarin.forms display


【解决方案1】:

我使用 Newtonsoft.Json 13.0.1 将 JSON 数组对象转换为通用列表,并且我还修改了您的 json.json 文件,删除了外括号。设置 json.json 文件 将动作构建为嵌入式资源

{
"regionData": [
  {
    "country": "World",
    "totalCases": 157341642,
    "newCases": 651328,
    "totalDeaths": 3278509,
    "newDeaths": 9126,
    "totalRecovered": 135480211,
    "activeCases": 18582922,
    "seriousCritical": 108879,
    "casesPerMil": 20185,
    "deathsPerMil": 420.6,
    "totalTests": 0,
    "testsPerMil": 0,
    "population": 0
  },
  {
    "country": "India",
    "totalCases": 21886556,
    "newCases": 401271,
    "totalDeaths": 238265,
    "newDeaths": 4194,
    "totalRecovered": 17917013,
    "activeCases": 3731278,
    "seriousCritical": 8944,
    "casesPerMil": 15729,
    "deathsPerMil": 171,
    "totalTests": 298601699,
    "testsPerMil": 214596,
    "population": 1391457000
  }
]
}

regionData属性包含列表数据,所以需要新建类TestList,包含List regionData属性

 public class TestList
{
    public List<TestModel> regionData { get; set; }
}

public class TestModel
{       
    public string country { get; set; }
    public string totalCases { get; set; }
}

ContentPage.cs:

  public Page3()
    {
        InitializeComponent();
        TestList modellist = new TestList();
      

        var assembly = typeof(jsonarray.Page3).GetTypeInfo().Assembly;          
        Stream stream = assembly.GetManifestResourceStream("FormsSample.json3.json");
        using (var reader = new System.IO.StreamReader(stream))
        {
            var jsonString = reader.ReadToEnd();

            //Converting JSON Array Objects into generic list               
            modellist = JsonConvert.DeserializeObject<TestList>(jsonString);

            
            listview1.ItemsSource = modellist.regionData;
        }
    }

最后,我在ListView中得到了列表数据,没有问题。

更新:

我的项目名为FormsSample,我在根目录下添加了Json3.json文件,Build Action as Embedded resource,可以看到如下截图。

第三页是一个ContentPage,包含ListView,用来展示Json数据。

<ContentPage
x:Class="FormsSample.jsonarray.Page3"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<ContentPage.Content>
    <StackLayout>
        <ListView x:Name="listview1">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal">
                            <Label Text="{Binding country}" />
                            <Label
                                HorizontalOptions="CenterAndExpand"
                                Text="{Binding totalCases}"
                                VerticalOptions="CenterAndExpand" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage.Content>

【讨论】:

  • 你好@Cherry BU。我对使用 Page3() 以及“FormsSample.json3.json”有点困惑。你能向我解释我应该如何继续吗?正如你告诉我的那样,我已经创建了一个类 TestList
  • @NikolaosEfentis 我的项目名称是 FormsSample,我在根目录中添加了 Json3.json 文件,Build Action 作为嵌入式资源。 Page 3 是一个 ContentPage,包含 ListView,用于显示 Json 数据。请查看我的更新。
  • 你能告诉我如何从 AppShell.xaml 中的 jsonarray 文件夹调用 page3 吗?
  • Cherry 我在 root 中创建了一个新页面,但它不起作用,请参阅上面的更新
  • @NikolaosEfentis 您使用 Xamarin.shell?你能把你的sample上传到github或者onedrive,我下载你的sample来测试,看看你遇到什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
相关资源
最近更新 更多