C# 从JSON本地存储图像。如何?

C# 从JSON本地存储图像。如何?,c#,json,image,windows-phone-8,local-storage,C#,Json,Image,Windows Phone 8,Local Storage,不知道你能不能在这里帮我 我从API中检索了一些数据,现在,在反序列化它之后,我将它放在了一个列表中 现在,这些数据中有一些图像我需要放在另一个页面的gridview中,由于我被要求在本地保存数据(并偶尔检查更新),我想知道我必须做些什么: 确保我了解情况(不仅仅是姓名) 将其保存到本地存储(带有其id),以便在以后的存储中 数据绑定资源 以下是我所拥有的: public class GetFromJson { private Medio medio = new Medio();

不知道你能不能在这里帮我

我从API中检索了一些数据,现在,在反序列化它之后,我将它放在了一个列表中

现在,这些数据中有一些图像我需要放在另一个页面的
gridview
中,由于我被要求在本地保存数据(并偶尔检查更新),我想知道我必须做些什么:

  • 确保我了解情况(不仅仅是姓名)
  • 将其保存到本地存储(带有其id),以便在以后的存储中 数据绑定资源
  • 以下是我所拥有的:

    public class GetFromJson
    {
    
        private Medio medio = new Medio();
        public async void GetFullResponse(string address)
        {
            try
            {
                var client = new HttpClient();
    
                var uri = new Uri(address);
                var Response = await client.GetAsync(uri);
                var statusCode = Response.StatusCode;
    
                Response.EnsureSuccessStatusCode();
    
                var ResponseText = await Response.Content.ReadAsStringAsync();
    
                string myJson = ResponseText;
    
                medio.deserializeAndConvert(myJson);
    
            }
    
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
        }
    }
    
    然后,要反序列化数据,请执行以下操作:

    public class Medio
    {
        public string id { get; set; }
        public string name { get; set; }
        public string type { get; set; }
        public string img { get; set; }
        public string medios_id { get; set; }
    
        public void deserializeAndConvert(string aaa)
        {
            JObject myGeneral = JObject.Parse(aaa);
            IList<JToken> results = myGeneral["resp"]["medios"].Children().ToList();
    
            IList<Medio> searchResults = new List<Medio>();
            foreach (JToken result in results)
            {
                Medio searchResult = JsonConvert.DeserializeObject<Medio>(result.ToString());
                searchResults.Add(searchResult);
                Debug.WriteLine(searchResults);
    
            }
    
    
            Debug.WriteLine(searchResults.Count);
            GlobalVariables.Medios = searchResults;
        }
    }
    
    公共类媒体
    {
    公共字符串id{get;set;}
    公共字符串名称{get;set;}
    公共字符串类型{get;set;}
    公共字符串img{get;set;}
    公共字符串medios_id{get;set;}
    public void反序列化和转换(字符串aaa)
    {
    JObject myGeneral=JObject.Parse(aaa);
    IList results=myGeneral[“resp”][“medios”].Children().ToList();
    IList searchResults=新列表();
    foreach(JToken result in results)
    {
    Medio searchResult=JsonConvert.DeserializeObject(result.ToString());
    searchResults.Add(searchResult);
    Debug.WriteLine(搜索结果);
    }
    Debug.WriteLine(searchResults.Count);
    GlobalVariables.Medios=搜索结果;
    }
    }
    
    有了这些,我就得到了我需要处理的数据,这些数据在应用程序运行时被加载

    之后,当我们转到我必须显示图像的页面时,我有以下内容:

    public BankAndCards()
        {
    
            createGridView();
            this.InitializeComponent();
        }
    
        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.
        /// This parameter is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }
    
        void createGridView()
        {
    
            QueryPicturesToShow();
        }
    
        public void QueryPicturesToShow()
        {
            var pics = from medio in GlobalVariables.Medios
                             where medio.id != null
                             select new { Name = medio.name, Id = medio.id, Picture = medio.img};
    
            foreach (var item in pics)
            {
                Debug.WriteLine(item.Name);
                Debug.WriteLine(item.Id);
                Debug.WriteLine(item.Picture);
    
                savePicToDisk();
            }
        }
    
        private async void savePicToDisk()
        {
            //what should I do here?
        }
    }
    
    公共银行卡()
    {
    createGridView();
    this.InitializeComponent();
    }
    /// 
    ///当此页面即将显示在框架中时调用。
    /// 
    ///描述如何到达此页面的事件数据。
    ///此参数通常用于配置页面。
    受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
    {
    }
    void createGridView()
    {
    QueryPicturesToShow();
    }
    public void QueryPicturesToShow()
    {
    var pics=来自GlobalVariables.Medios中的medio
    其中medio.id!=null
    选择新{Name=medio.Name,Id=medio.Id,Picture=medio.img};
    foreach(pics中的var项目)
    {
    Debug.WriteLine(项目名称);
    Debug.WriteLine(item.Id);
    调试写入线(项目图片);
    savePicToDisk();
    }
    }
    私有异步void savePicToDisk()
    {
    //我在这里该怎么办?
    }
    }
    
    我从API获得的数据显示(按顺序:名称、id、图片)

    加利西亚银行2/方法/21030342

    班戈河3/方法/210321012

    非常感谢

    我明白了。。。 由于某种原因,我无法看到文件夹中的图片,直到我拔下手机并再次插入

    public void QueryPicturesToShow()
        {
    
            var pics = from medio in GlobalVariables.Medios
                       where medio.img != null
                       select new { Name = medio.name, Id = medio.id, Picture = medio.img };
    
            foreach (var item in pics)
            {
                Debug.WriteLine(item.Name);
                Debug.WriteLine(item.Id);
                Debug.WriteLine(item.Picture);
    
    
    
                savePicToDisk(item.Picture, item.Name, item.Id);
            }
        }
    
                    private async void savePicToDisk(string picAddress, string picName, string picId)
                    {
    
                        StorageFolder folder = await KnownFolders.PicturesLibrary.CreateFolderAsync("workingFolder", CreationCollisionOption.OpenIfExists);
    
                        StorageFile file = await folder.CreateFileAsync((picName + picId + ".png"), CreationCollisionOption.ReplaceExisting);
    
                        string url = GlobalVariables.apiUrl + picAddress;
    
    
                        Debug.WriteLine(url);
                        HttpClient client = new HttpClient();
    
                        byte[] responseBytes = await client.GetByteArrayAsync(url);
    
                        var stream = await file.OpenAsync(FileAccessMode.ReadWrite);
    
                        using (var outputStream = stream.GetOutputStreamAt(0))
                        {
                            DataWriter writer = new DataWriter(outputStream);
                            writer.WriteBytes(responseBytes);
                            await writer.StoreAsync();
                            await outputStream.FlushAsync();
    
                        }
        }
    
    因此,现在,我只需要知道如何将它们绑定到gridView,因此,如果有人知道,您将为我节省大量时间(我想将它们放在列表中,但我不确定是否有效)


    谢谢

    我会实现某种缓存。检索JSON和图像后,将图像存储在缓存中。当您以后需要图像时,请从缓存中检索它。如果图像过时,请再次从源中检索它。顺便说一句,你的目标环境是什么?WPF、Silverlight、Windows Phone?请为您的问题添加适当的标签。WP8.1。。。很抱歉,我没有标记I该图像如何在JSON中序列化?Base64?似乎,从JSON中,我得到了图片的“地址”,下载/显示在网格中……下面是一个例子:因此,它改变了整个主题:如何从web下载和保存图片并显示在网格中(至少如何下载图片并保存在可访问的地方)