본문 바로가기

C#/수업 내용

json저장, 불러오기

App

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

namespace HelloWorld
{
    class App
    {
        //생성자
        public App()
        {
            //7. 파일 불러오기 
            string infoPath = "./weapon_info.json";
            //4. 파일 읽기
            string path = "./weapon_data.json";
            string json = File.ReadAllText(path);
            
            Dictionary<int, WeaponData> dicWeaponDatas = new Dictionary<int, WeaponData>();

            //5.역직렬화, 6.사전에 넣기 
            //WeaponData[] weaponDatas = JsonConvert.DeserializeObject<WeaponData[]>(json);
            //foreach (WeaponData data in weaponDatas)
            //{
            //    dicWeaponDatas.Add(data.id, data);
            //}
            dicWeaponDatas =
                JsonConvert.DeserializeObject<WeaponData[]>(json).ToDictionary(x => x.id);

            //요소가 잘들어갔는지 출력이 잘되는지 확인
            //foreach (KeyValuePair<int, WeaponData> data in dicWeaponDatas)
            //{
            //    Console.WriteLine("{0} {1}", data.Key, data.Value.name);
            //}

            //신규, 기존 구현하기 
            if (File.Exists(infoPath))  //해당경로에 파일이 있는지 확인
            {
                Console.WriteLine("기존 유저");
                string infoJson = File.ReadAllText(infoPath);   //파일의 텍스트들을 불러옴
                WeaponInfo info = JsonConvert.DeserializeObject<WeaponInfo>(infoJson);
                Weapon weapon = new Weapon(info);
                Console.WriteLine("-> {0}", weapon);
                Console.WriteLine("-> {0}", weapon.GetInfo().id);
                Console.WriteLine("-> {0}", weapon.Reinforcement);
            }
            else
            {
                Console.WriteLine("신규 유저");
                //3. 무기 정보 객체 생성 
                WeaponInfo info = new WeaponInfo(dicWeaponDatas[100], 0);
                Console.WriteLine("생성된 정보객체 id:{0}, 강화수치:{1}", info.data.id, info.reinforcement);
                //4. 무기 객체 생성 
                Weapon weapon = new Weapon(info);
                WeaponData data = weapon.GetInfo();
                Console.WriteLine("생성된 무기객체 id:{0}, 강화수치:{1}", data.id, weapon.Reinforcement);

                Reinforce(weapon);
                //5. 무기 정보 객체 직렬화 
                //저장하려고 하는 객체의 info객체를 만들어라
                WeaponInfo info0 = new WeaponInfo(weapon.GetInfo(), weapon.Reinforcement);
                //직렬화
                string serializedJson = JsonConvert.SerializeObject(info0);
                //6. 파일로 저장
                File.WriteAllText("./weapon_info.json", serializedJson);
            }

            //WeaponInfo info = new WeaponInfo(dicWeaponDatas[100], 0);
            //Console.WriteLine("생성된 정보객체 id:{0}, 강화수치:{1}", info.data.id, info.Reinforcement);
            //Weapon weapon = new Weapon(info);
            //WeaponData data = weapon.GetInfo();
            //Console.WriteLine("생성된 무기객체 id:{0}, 강화수치:{1}", data.id, weapon.Reinforcement);

            //Reinforce(weapon);

            ////저장하려고 하는 객체의 info객체를 만들어라
            //WeaponInfo info0 = new WeaponInfo(weapon.GetInfo(), weapon.Reinforcement);
            ////직렬화
            //string serializedJson = JsonConvert.SerializeObject(info0);
            ////저장
            //File.WriteAllText("./weapon_info.json", serializedJson);
        }

        void Reinforce(Weapon weapon)
        {
            weapon.Reinforcement += 1;
            Console.WriteLine("무기강화");
        }
    }
}

WeaponInfo

더보기
using System;

namespace HelloWorld
{
    //2. 무기 정보 클래스 
    class WeaponInfo
    {
        public WeaponData data;
        public int reinforcement;

        public WeaponInfo(WeaponData data, int reinforcement)
        {
            this.data = data;
            this.reinforcement = reinforcement;
        }
    }
}

Weapon

더보기
using System;

namespace HelloWorld
{
    //1. 무기 클래스 
    class Weapon
    {
        private WeaponInfo info;
        private int reinforcement;

        public int Reinforcement
        { 
            get
            {
                return this.info.reinforcement;
            }
            set
            {
                this.info.reinforcement = value;
            }
        }

        //생성자
        public Weapon(WeaponInfo info)
        {
            this.info = info;
        }

        public WeaponData GetInfo()
        {
            return this.info.data;
        }
    }
}

WeaponData

더보기
using System;

namespace HelloWorld
{
    //3. 매핑클래스 만들기 
    public class WeaponData
    {
        public int id;
        public string name;
        public float damage;
    }
}

신규(weapon_info.json파일이 없다면)

기존(weapon_info_json파일이 있다면)

 

'C# > 수업 내용' 카테고리의 다른 글

반복기  (0) 2021.12.24
event  (0) 2021.12.24
파일 읽기, 역직렬화 연습 2  (0) 2021.12.24
파일 읽기, 역직렬화 연습  (0) 2021.12.24
람다식 연습 15 (Comparision)  (0) 2021.12.24