Để làm việc với Json (JavaScript Object Notation) trong Universal App có nhiều thư viện hỗ trợ rất tốt, phải kể đến cái tên nổi bật như Json.NET. Nếu bạn quan tâm có thể tìm hiểu thêm: https://json.codeplex.com/
Nhưng nếu bạn yêu thích và muốn dùng thư viện đơn thuần của .NET, hãy tiếp tục xem qua nội dung dưới đây.



.NET có một vài thư viện hỗ trợ làm việc với Json, nhưng Windows.Data.Json là sự lựa chọn tốt hơn cho ứng dụng Universal của chúng ta hôm nay.

1. Basic Background

a. Json Values

Các loại giá trị được hỗ trợ gồm:
- Strings
- Numbers
- True
- False
- Null
- Objects
- Arrays

b. Json Object

- Mở đầu và kết thúc bằng dấu ngoặc nhọn.
- Key/value được ngăn cách bằng dấu 2 chấm.
- Key phải ở trong dấu ngoặc kép
- Ngăn cách các cặp giá trị bằng dấu phẩy.
{
   key: value,
   key: value
}

c. Json Array

- Value bắt đầu và kết thúc bằng dấu ngoặc vuông
- Ngăn cách mỗi value là dấu phẩy
[value,value,value,value]

d. Json Data

- Json object và array đều là Json Values
- Json object và array có thể lồng vào nhau.
- Json object chứa tất cả Json Values tạo thành một dữ liệu có cấu trúc
{
"id":1,
"name": "Le Minh Tuan",
"online": true,
"list1":[true,false],
"list2":[1,2,3,4,5],
"list3":["a","b","c","d"]
}

2. Windows.Data.Json

Về cơ bản Json chỉ là một chuỗi string không hơn, để làm việc được với nó, bạn sẽ dùng các class hỗ trợ chuyển đổi về object để xử lý.
- Nó là một chuỗi string chứa hoàn toàn dữ liệu có định dạng. Bạn không thể thêm một comment trong đấy như xml hay các ngôn ngữ khác
- Nếu một chuỗi string Json có định dạng không đúng chương trình sẽ gặp rắc rối.
- Đối với dữ liệu bạn phải tự validate dữ liệu nhập vào là đúng, không trùng hoặc theo bất cứ quy định nào của bạn.
- Có 2 phương thức chính mà bạn cần quan tâm khi làm việc với Json:
Parse: Chuyển đổi chuỗi  string  về  Object
Stringify: Chuyển một Object về string
- Nếu bạn muốn lấy dữ liệu Json từ Server, có thể tham khảo Windows.Web.Http.HttpClient

3. Working on it

Ta sẽ xây dựng một ví dụ đơn giản, sử dụng MVVM để đơn giản hóa thao tác CRUD.
(Mặc dù demo là Universal App nhưng giao diện không tối ưu cho điện thoại, bạn có thể deploy trên Local Machine để xem giao diện đầy đủ)


a. Model

- Tạo các Key cho các trường dữ liệu. Các key này luôn đặt trong ngoặc kép nên nó sẽ có kiểu string.
- Tạo properties nó là Value của các Key
Vì toàn bộ dữ liệu ta sẽ lưu trong một file nên ta sẽ khai báo Key/value trong một class riêng sau đó kế thừa cho các model. (Bạn có thể làm theo cách mà mình muốn).
- Tiếp theo ta cần triển khai các phương thức cho model của mình.

b. Services

Để tái sử dụng, ta sẽ viết một vài class để hỗ trợ cho chương trình ở đây. Mà cụ thể, ta sẽ viết một class hỗ trợ việc đọc/ghi dữ liệu trong ứng dụng.
Để có thể đọc ghi nhiều model khác nhau ta cần một temple chung.  Windows.Data.Json chưa có phương thức nào hỗ trợ điều này.
Vậy tôi tạo một mẫu tương tự, bạn có thể xem đầy đủ trong mã nguồn cuối  bài viết này.

//*********************************************************
//
// More samples on 'http://www.bravohex.com' (c) 2015
//
//*********************************************************
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;

namespace JsonDemo.Common
{
public static class JsonDataConvert
{
/// <summary>
/// Support SerializeObject
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="item"></param>
/// <returns></returns>
public static string SerializeObject<T>(T item)
{
var result = string.Empty;
var objList = (item as IList);
var obj = objList[objList.Count <= 0 ? 0 : objList.Count - 1];
var type = obj.GetType();
MethodInfo magicMethod = type.GetMethod("Stringify");
result = (string)magicMethod.Invoke(obj, null);
return result;
}

/// <summary>
/// Support DeserializeObject
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json"></param>
/// <returns></returns>
public static T DeserializeObject<T>(string json)
{
var typeList = typeof(T);
var type = typeList.GenericTypeArguments[0];
var instanceObject = Activator.CreateInstance(type, json);
IList list = InstanceListType(type);
list.Add(instanceObject);

object result = list;
if (result is T)
{
return (T)result;
}
else
{
try
{
return (T)Convert.ChangeType(result, typeof(T));
}
catch (InvalidCastException)
{
return default(T);
}
}
}
private static IList InstanceListType(Type type)
{
var listType = typeof(List<>);
var constructedListType = listType.MakeGenericType(type);
var instance = Activator.CreateInstance(constructedListType);
return (IList)instance;
}
}
}

c. Repository/ViewModel

Bạn có thể gộp hai mục này thành một hoặc tách ra để gọn gàng, bảo mật hơn. Các phương thức chính ta đã khai báo ở Model nên ở đây không có gì nhiều để làm ngoại trừ validate dữ liệu cho chính xác.
Lưu ý:
Ta sử dụng ObservableCollection để giúp notify trạng thái dữ liệu của danh sách lên giao diện UI, nhưng bạn cần biết nó chỉ có ích khi một item được add/remove. Nếu bạn update item, mặc dù dữ liệu bên dưới thay đổi nhưng UI không được thông báo về điều này. Bạn phải làm cách nào đó, ok ta sẽ cũng sẽ implement INotifyPropertyChanged tại Model. Điều này giúp toàn bộ dữ liệu luôn được cập nhật 2 chiều tự động. Bây giờ nó có vẻ sống động hơn !

Created: 01/11/2015
Updated: 02/11/2015
Sample: Full Source Code

thumbnail [UWP] Working With Windows.Data.Json

data:label.name author

premiumpng.com

Design Publisher

Download 0
No comments
Template in .PSD format

MR Laboratory License

Free for personal purpose use . More info


Buy Now This Template

No comments:

Post a Comment

Commets Download Photoshop Actions, Lightroom Presets, PSD Template, Mockups, Stocks, Vectors, Fonts. Download free

Newer Post Older Post Home

Copyright © 2021 MR Laboratory All rights reserved.

Setting