扫描二维码时显示 Json 列表中的项目

Posted

技术标签:

【中文标题】扫描二维码时显示 Json 列表中的项目【英文标题】:Showing item from Json list while scanning QR code 【发布时间】:2020-05-22 22:20:05 【问题描述】:

我有 JSON 格式的列表,我正在反序列化它。它看起来像这样:

[
  
    "Nazwa": "Czekolada mleczna Sport & Fitness",
    "Opis": "Przykładowy opis produktu Czekolada mleczna Sport & Fitness",
    "Zdjecie": "https://www.friars.co.uk/images/lindt-gold-milk-chocolate-bar-p504-7263_image.jpg",
    "WW": 0.28,
    "WBT": 0.22,
    "Energia": 31.8125,
    "Tluszcz": 2.19375,
    "Weglowodany": 3.225,
    "Blonnik": 0.11875,
    "Bialko": 0.45625,
    "Zelazo": 0.1875,
    "Wapn": 15.5,
    "Code": "czokolate_1"
  ,
  
    "Nazwa": "Czekolada mleczna Sport & Fitness2",
    "Opis": "Przykładowy opis produktu Czekolada mleczna Sport & Fitness2",
    "Zdjecie": "https://vaya.in/recipes/wp-content/uploads/2018/02/Milk-Chocolate-1.jpg",
    "WW": 0.16,
    "WBT": 0.21,
    "Energia": 28.5625,
    "Tluszcz": 2.19375,
    "Weglowodany": 2.94375,
    "Blonnik": 0.4875,
    "Bialko": 0.34375,
    "Zelazo": 0.8125,
    "Wapn": 0,
    "Code": "czokolate_2"
  
]

我正在使用ZXing.Net.Mobile.Forms扫描二维码。为了处理结果,我有这个代码:

public Item item  get; set; 
public void Handle_OnScanResult(Result result)
        
            Device.BeginInvokeOnMainThread(async () =>
            
                string code = item.Code;
                string wynik = result.Text;
                if (wynik == code) 
                    await Navigation.PushAsync(new ItemDetailPage(item.Nazwa, item.Opis, item.Zdjecie, item.WW, item.WBT, item.Energia, item.Tluszcz, item.Weglowodany, item.Blonnik, item.Bialko, item.Zelazo, item.Wapn, item.Code));
                    await DisplayAlert("Wyszukaj?", item.Nazwa, "OK");
                
            );
        

item.Code 是分配给 JSON 列表中项目的值,如果我使用 QR 码也有这个值

Device.BeginInvokeOnMainThread(async () =>
            
                string wynik = result.Text;
                    await DisplayAlert("Wyszukaj?", wynik, "OK");
                
            );

它显示了这个值“code”。我希望它显示包含所有值的详细信息页面(我有它,但只有当您单击列表中的项目时,它才会将此项目的所有值发送到 ItemDetailPage) 项目页面

async void OnItemSelected(object sender, SelectedItemChangedEventArgs args)
        
            if (!(args.SelectedItem is Item item))
                return;

            await Navigation.PushAsync(new ItemDetailPage(item.Nazwa, item.Opis, item.Zdjecie, item.WW, item.WBT, item.Energia, item.Tluszcz, item.Weglowodany, item.Blonnik, item.Bialko, item.Zelazo, item.Wapn, item.Code));

            // Manually deselect item.
            ItemsListView.SelectedItem = null;
        

ItemDetailPage

public ItemDetailPage(string Nazwa, string Opis, string Zdjecie, float WW, float WBT, float Energia, float Tluszcz, float Weglowodany, float Blonnik, float Bialko, float Zelazo, float Wapn, string Code)
        
            InitializeComponent();

            tytul.Title = Nazwa;
            nazwa.Text = Nazwa;
            opis.Text = Opis;
            foto.Source = ImageSource.FromUri(new Uri(Zdjecie));
            ww_item.Text = WW.ToString();
            wbt_item.Text = WBT.ToString();
            energia_item.Text = Energia.ToString();
            tluszcz_item.Text = Tluszcz.ToString();
            weglowodany_item.Text = Weglowodany.ToString();
            blonnik_item.Text = Blonnik.ToString();
            bialko_item.Text = Bialko.ToString();
            zelazo_item.Text = Zelazo.ToString();
            wapn_item.Text = Wapn.ToString();
        

我希望它移动到 ItemDetailPage,其中包含与 QR 码具有相同“代码”值的项目详细信息 要么 我希望它仅显示具有“代码”值作为 QR 码的那些项目的 ItemPage。 我尝试使用类似搜索栏的东西,但无法使用 JSON 列表

【问题讨论】:

您是在问如何在列表中找到与扫描代码匹配的项目? @Jason 是的,这就是我的意思,对不起,如果我不够清楚 还会有一件商品匹配一个二维码 我建议您将项目传递给ItemDetailPage,而不是详细属性。 @JackHua-MSFT 我试过这样做,但它对我不起作用,这就是我使用详细属性的原因 【参考方案1】:

从列表中选择单个项目(假设 itemsList<Item>

using System.Linq;

var item = items.FirstOrDefault(x => x.Code == result.Text);

选择所有匹配项

var allitems = items.Where(x => x.Code == result.Text).ToList();

【讨论】:

我在 ItemDetailPage 中只有 Observablecollection 我试过你说的,现在看起来像这样:public ObservableCollection<Item> items get; set; public void Handle_OnScanResult(Result result) Device.BeginInvokeOnMainThread(() => var item = items.FirstOrDefault(x => x.Code = result.Text); ); 我有两个错误,我无法将字符串转换为布尔值,而这个错误:CS1662 C# Cannot convert lambda将表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型 你为什么要这样做?这不是 UI 操作。它只是在您的列表中找到匹配的数据。然后,您可以将该数据传递到您的 UI 页面。还要检查“=”与“==” 好的,我有类似 public async void Handle_OnScanResult(Result result) var item = items.FirstOrDefault(x => x.Code == result.Text); await Navigation.PushAsync(new ItemPage()); 的东西,但我不知道我应该将这些数据传递到哪里,到 ItemPage 或 ItemsViewModel? ItemDetailPage,我假设

以上是关于扫描二维码时显示 Json 列表中的项目的主要内容,如果未能解决你的问题,请参考以下文章

vue项目如何在手机上测试

android 二维码扫描

expo项目,无法通过扫描二维码将项目加载到iPhone,如何解决?

Android 基于google Zxing实现二维码条形码扫描,仿微信二维码扫描效果

H5端扫描二维码

项目经验Angular中实现扫描二维码