【C#】复杂数据结构和Json的相互转换

数据结构定义

//数据结构定义
public class People
{
    public string name;
    public BaseInfo baseInfo;
    public List<School> education;
}
public class BaseInfo
{
    public int age;
    public bool gender;
    public List<Connection> connection;
}
注意一:Json结果展示枚举对于字符串

枚举数据转Json会转成对应数值

connectionWay = ConnectionWay.phone,
==>实际
"connectionWay" = 0,   
==>目标
"connectionWay" = “phone”, 

如果需要在json中展示枚举的字符串,需要增加

[JsonConverter(typeof(StringEnumConverter))]

public class Connection
{
    [JsonConverter(typeof(StringEnumConverter))] 
    public ConnectionWay connectionWay;
    public string text;
}
public enum ConnectionWay
{
    phone,
    email
}
注意二:Json结果展示私有变量

数据结构转Json过程中私有变量无法转换成功,需要增加

[JsonObject(MemberSerialization.OptIn)]定义在数据结构声明处

[JsonProperty]定义在需要json化私有变量声明处

[JsonObject(MemberSerialization.OptIn)]
public class School{
    [JsonProperty]
    private string name;
    [JsonProperty]
    private int completeYear;
    [JsonProperty]
    [JsonConverter(typeof(StringEnumConverter))]
    private EducationType educationType;
    
    private string address;
    public School(string name,int completeYear,EducationType educationType,string address = "")
    {
        ...;
    }
}
public enum EducationType
{
    highSchool,
    college
}

数据实例

People p = new People(){
    name = "Andy",
    baseInfo = new BaseInfo{
        age = 23,
        gender = false,
        connection = new List<Connection> {
            new Connection{
                connectionWay = ConnectionWay.phone,
                text = "88888888"
            },
            new Connection{
                connectionWay = ConnectionWay.email,
                text = "8888@123.com"
            }
        }
    },
    education = new List<School> {
        new School("某211",2017,EducationType.college,"北京市"),
        new School("某高级中学",2013,EducationType.highSchool,"孔子县")
    }
};

数据保存为Json文件

private void SaveData2JsonFile(string filePath)
{
    string json = JsonConvert.SerializeObject(p);
    using (System.IO.StreamWriter file = new System.IO.StreamWriter(filePath))
    {
        JObject jobject = JObject.Parse(json);
        file.Write(jobject.ToString());
    }
}

json文件内容

丢失School.address,由于定义时没有处理。

{
    "name":"Andy",
    "baseInfo":{
        "age" : 23,
        "gender" : false,
        "connection":[{
            "connectionWay":"phone",
            "text": "88888888"
        },{
            "connectionWay":"email",
            "text": "8888@123.com"
        }]
    },
    "education":[{
        "name":"某211",
        "completeYear":2017,
        "educationType":"college"
    },{
        "name":"某高级中学",
        "completeYear":2013,
        "educationType":"highSchool"
    }]
}

解析Json为对应数据结构实例

JsonUtility.FromJson<T>(json)

jObject["字段名"].ToObject<T>()

无法正确的转换List、嵌套数据结构等,只能解析简单数据结构

public void LoadJsonFile(string filePath)
{
    using (System.IO.StreamReader file = System.IO.File.OpenText(filePath))
    {
        using (JsonTextReader reader = new JsonTextReader(file))
        {
            Json2DataModel((JObject)JToken.ReadFrom(reader));
        }
    }
}
private void Json2DataModel(JObject jObject)
{
    List<School> education = new List<School>();
    foreach (var item in JArray.Parse(jObject["education"].ToString()))
    {
        education.Add(new School(
            item["name"].ToString(),
            int.Parse(item["completeYear"].ToString()),
            (EducationType)Enum.Parse(typeof(EducationType), item["educationType"].ToString())
        ));
    }

    BaseInfo baseInfo = jObject["baseInfo"].ToObject<BaseInfo>();
    List<Connection> connection = new List<Connection>();
    foreach (var item in JArray.Parse(jObject["baseInfo"]["connection"].ToString()))
    {
        ConnectionWay connectionWay = (ConnectionWay)Enum.Parse(typeof(ConnectionWay), item["connectionWay"].ToString());
        Connection conn = JsonUtility.FromJson<Connection>(item.ToString());
        connection.Add(conn);
    }
    baseInfo.connection = connection;

    People p = JsonUtility.FromJson<People>(jObject.ToString());
    p.baseInfo = baseInfo;
    p.education = education;
}
posted @ 2024-10-11 10:00  Sitar  阅读(10)  评论(0编辑  收藏  举报