Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Deserialize JSON sang đối tượng .NET và lấy giá trị từ mảng với Newtonsoft.Json

Sử dụng JsonConvert.DeserializeObject<T> để chuyển JSON thành đối tượng C# mạnh kiểu (strongly-typed).

Ví dụ: Gọi API, deserialize, lấy item đầu tiên


using Newtonsoft.Json;
using System.Net;

public class Post
{
    public int UserId { get; set; }
    public int Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
}

class Program
{
    static void Main()
    {
        using var client = new WebClient();
        string json = client.DownloadString("https://jsonplaceholder.typicode.com/posts");
        
        // Deserialize thành mảng Post[]
        Post[] posts = JsonConvert.DeserializeObject(json);
        
        // Lấy phần tử đầu tiên
        if (posts.Length > 0)
        {
            Console.WriteLine($"First Post Title: {posts[0].Title}");
            Console.WriteLine($"Body: {posts[0].Body}");
        }
        
        Console.ReadLine();
    }
}

Kết quả


First Post Title: sunt aut facere repellat provident occaecati excepturi optio reprehenderit
Body: quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae...

Deserialize thành List<T> (LINQ friendly)


List posts = JsonConvert.DeserializeObject>(json);
// Hoặc
var posts = JsonConvert.DeserializeObject>(json);

Deserialize động (Dynamic / JObject) - Không cần class


// 1. dynamic
dynamic posts = JsonConvert.DeserializeObject(json);
Console.WriteLine(posts[0].title); // Runtime binding

// 2. JObject / JArray (LINQ to JSON)
JArray array = JArray.Parse(json);
string firstTitle = array[0]["title"].ToString();
Console.WriteLine(firstTitle);

// 3. Chỉ lấy field cần (Anonymous type)
var posts = JsonConvert.DeserializeAnonymousType(json, new[] { new { title = "" } });
Console.WriteLine(posts[0].title);

Tuỳ chọn Deserialize (JsonSerializerSettings)


var settings = new JsonSerializerSettings
{
    // Property name mapping
    ContractResolver = new CamelCasePropertyNamesContractResolver(), // camelCase JSON -> PascalCase C#
    
    // Null handling
    NullValueHandling = NullValueHandling.Ignore,
    
    // Date format
    DateFormatString = "yyyy-MM-dd",
    
    // Missing member
    MissingMemberHandling = MissingMemberHandling.Ignore,
    
    // Reference loop
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};

var posts = JsonConvert.DeserializeObject(json, settings);

HttpClient (Modern, .NET Core 2.1+)


using System.Net.Http;
using System.Net.Http.Json; // .NET 5+ built-in

// .NET 5+ built-in JSON (System.Text.Json)
var posts = await client.GetFromJsonAsync("https://jsonplaceholder.typicode.com/posts");

// Hoặc Newtonsoft với HttpClient
var json = await client.GetStringAsync(url);
var posts = JsonConvert.DeserializeObject(json);

Lưu ý

  • WebClient đã obsolete (.NET Core 3.0+), hãy dùng HttpClient.
  • Luôn dùng using / await using cho HttpClient (hoặc singleton/static).
  • Xử lý exception: HttpRequestException, JsonSerializationException.
  • Validation: Kiểm tra posts?.Length > 0 trước khi truy cập index.