1. 程式人生 > 實用技巧 >C#處理JSON - 學習筆記

C#處理JSON - 學習筆記


視訊連結:https://www.bilibili.com/video/BV1Yt41127rC


教程使用兩種庫對JSON檔案進行序列化和反序列化。

1、JavaScriptSerializer

在專案中新增引用:System.Web.Extension

然後使用 using 語句匯入名稱空間:System.Web.Script.Serialization

示例1,讀:從json檔案中反序列化資料

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Web.Script.Serialization; namespace json_read { class Person { public string name { get; set; } public int age { get; set; } public override string ToString() { return string.Format("Name: {0} \nAge: {1}",name,age); } }
class Program { static void Main(string[] args) { String jsonString = File.ReadAllText("json.json"); JavaScriptSerializer serializer = new JavaScriptSerializer(); Person p1 = serializer.Deserialize<Person>(jsonString); Console.WriteLine(p1); Console.ReadKey(); } } }

示例2,寫:序列化資料寫入json檔案

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;

namespace json_write
{
    class Person
    {
        public string name { get; set; }
        public int age { get; set; }
        public override string ToString()
        {
            return string.Format("Name: {0} \nAge: {1}",name,age);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            Person person = new Person { name = "Ben", age = 58 };
            string jsonOutput = serializer.Serialize(person);
            File.WriteAllText("Output.json",jsonOutput);
            Console.ReadKey();
        }
    }
}

2、JSON.NET

使用 Nuget 安裝 Newtonsoft.Json,教程中安裝的是 Json.NET(可能現在更新了吧)

然後使用 using 語句匯入名稱空間:Newtonsoft.Json

示例1,讀:從json檔案中反序列化資料

using System;
using
System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using Newtonsoft.Json; namespace json_read { class Person { public string name { get; set; } public int age { get; set; } public override string ToString() { return string.Format("Name: {0} \nAge: {1}", name, age); } } class Program { static void Main(string[] args) { String jsonString = File.ReadAllText("json.json"); Person p1 = JsonConvert.DeserializeObject<Person>(jsonString); Console.WriteLine(p1); Console.ReadKey(); } } }

示例2,寫:序列化資料寫入json檔案

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;

namespace json_write
{
    class Person
    {
        public string name { get; set; }
        public int age { get; set; }
        public override string ToString()
        {
            return string.Format("Name: {0} \nAge: {1}", name, age);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person { name = "Ben", age = 58 };
            string jsonOutput = JsonConvert.SerializeObject(person);
            File.WriteAllText("Output.json", jsonOutput);
            Console.ReadKey();
        }
    }
}

綜合應用示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
using System.Net.Http.Headers;

namespace 綜合應用
{
    class Item : IEquatable<Item>
    {
        public string name;
        public int price;

        public Item(string name, int price = 0)
        {
            this.name = name;
            this.price = price;
        }

        public bool Equals(Item other)
        {
            if (other == null) return false;
            return (this.name.Equals(other.name));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Reading data.json");
            string jsonString = File.ReadAllText("data.json");
            List<Item> myList = JsonConvert.DeserializeObject<List<Item>>(jsonString);

            if (myList == null)
                myList = new List<Item>();

            string input = "";
            int inputInt = 0;
            string inputString = "";

            while (input != "q")
            {
                Console.WriteLine("Press 'a' to Add new Item");
                Console.WriteLine("Press 'd' to Delete Item");
                Console.WriteLine("Press 's' to Show Content");
                Console.WriteLine("Press 'q' to Quit Program");
                Console.WriteLine("Press Command");

                input = Console.ReadLine();
                switch(input)
                {
                    case "a":
                        Console.WriteLine("Adding a new item");
                        Console.WriteLine("Enter item name");
                        inputString = Console.ReadLine();
                        Console.WriteLine("Enter item price (Numeric Values Only)");
                        inputInt = Convert.ToInt32(Console.ReadLine());
                        myList.Add(new Item(inputString, inputInt));
                        Console.WriteLine("Added item " + inputString + "with price " + inputInt);
                        break;
                    case "d":
                        Console.WriteLine("Deleting item");
                        Console.WriteLine("Enter item name to delete:");
                        inputString = Console.ReadLine();
                        myList.Remove(new Item(inputString));
                        Console.WriteLine("Deleted item with name" + inputString);
                        break;
                    case "q":
                        Console.WriteLine("Quit Program");
                        break;
                    case "s":
                        Console.WriteLine("\nShowing Contents:");
                        foreach (Item item in myList)
                        {
                            Console.WriteLine("Item: "+ item.name + " | $" + item.price);
                        }
                        Console.WriteLine("\n");
                        break;
                    default:
                        Console.WriteLine("Incorrect command, try again");
                        break;
                }
            }

            Console.WriteLine("Rewriting data.json");
            string data = JsonConvert.SerializeObject(myList);
            File.WriteAllText("data.json", data);
            Console.ReadKey();
        }
    }
}