c#中的json数据

news2025/1/18 7:34:47

JSON数据

数据传输的语言,用于前后端数据交互的语言,注意xml的区别。

json和xml的区别

xml:可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。

json:(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。

二者区别:

它们都是一种数据交换格式。

1,xml是重量级的,json是轻量级的。

2,xml在传输过程中比较占带宽,json占带宽少,易于压缩。

3,xml和json都用在项目交互下,xml多用于做配置文件,json用于数据交互。

4,json可用jackson,gson等方法解析,xml可用dom,sax,demo4j等方式解析。

1.json基础

javascript object notation JS 对象

1.1定义

JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

1.2json的数据格式

数字型:short int long float double

字符型: string char

布尔型: true false

null: null

数组型:

对象型:

1.3json的符号含义

[ ] 表示数组

{ } 表示对象或者字典

1.4序列化

c#----json
​
结果是string

1.5反序列化

json的使用

json---c#的

1.6json的格式

大括号包裹

键值对使用 逗号隔开

键值对使用冒号隔开:

  1. {"ID":102,
    "Name":"jame",
    "Age":18,
    "IsStudent":false,
    "obj":null
    }
    最后键值对没有逗号

2.excel怎么变为json

excel----保存为csv---在线工具转为json

注意:如果excel的内容是///英文输入法的逗号//,会包错,在线转换json的工具有bug。

1.编辑excel文件

 

2.另存为CSV格式

 

3.打开并复制csv

 

4.在线转换csv--json

 

5.检验一下是否是正确的json格式

 

[{
        "ID": 1,
        "Name": "大刀",
        "Descript": "可以涮敌人两个Hp",
        "Level": 3,
        "price": 3
    },
    {
        "ID": 2,
        "Name": "皇荒杖",
        "Descript": "可以积分,和打怪",
        "Level": 2,
        "price": 2
    },
    {
        "ID": 3,
        "Name": "雨霖铃",
        "Descript": "迷惑一分钟(暂停)",
        "Level": 3,
        "price": 2
    },
    {
        "ID": 4,
        "Name": "补气丹",
        "Descript": "可以补充1个HP",
        "Level": 1,
        "price": 1
    }
]

6.保存为json文件

 

7.放置在resources文件夹的json的文件夹

 

3.json的工具

www.bejson.com

4.unity的内置转换json的工具

最外层结构必须是对象结构

类名:JsonUtillity

方法:

ToJson(对象)

formJson<类名>()

4.1c#--转为json(序列化)

1.写一个类,里面有属性、

2.然后再start(){   

var 一个对象=new 类名();

对象名。属性=值;

对象名。属性=值;

对象名。属性=值;

3.调用JsonUtillity。ToJson(对象名),返回一个string类型的json。

string json=JsonUtillity。ToJson(对象名);

}

​4.2json---转为c#(反序列化)

1.先按着这个json 的内容 先建立一个类 属性就是类型的

获取这个json文件,使用resource.load<textAsset>("路径");返回的是TextAsset类型

获得这个文件里面的内容,变量名。text 返回额是是string类型s

使用JsonUtillity。fromJson<新建的类名>(s文本),返回的是 新建的类名。

报错,因为这个json最外层是是数组结构

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
​
​
​
[System.Serializable]
public class item
{
    public int ID;
    public string Name;
    public string Descript;
    public int Level;
    public int price;
​
}
[System.Serializable]
public class jsonToUse : MonoBehaviour
{   
    //建立json的类
    //1.获得json文件
    //2.获得文件的文字
    //3.解析json
    //4.校验是否正确 输出
​
    void Start()
    {
        TextAsset asset=Resources.Load<TextAsset>("Json/item");
        string json = asset.text;
        List<item> item= JsonUtility.FromJson<List<item>>(json);
        //使用数组来接受,但是不可以
        Debug.Log(item[0].Name);
​
​
    }
​
    
}

json外层结构是数组的解决方法

1.外面再套一层
2.c#的结构变化为,多添加一个类,但是类的一个属性名必须为Data(你添加的属性),属性的类型必须是list<原来的类名>
类都需要加特性
3.调用的时候要多加一层

 

1.json文件外层包裹一个{"Data":[数组内容]}

{    "Data"  :   [数组内容]
}


2.c#结构变化(类上加特性)



[System.Serializable]
public class Item{
    public List<ItemRow> Data;
}
[System.Serializable]
public class ItemRow{
    public int ID;
    public string Name;
    public string Description;
    public int Level;
    public int Price;
}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
​
​
//特性
[System.Serializable]
public class ItemJson
{
    public List<item> Data;
}
​
//特性
[System.Serializable]
public class item
{
    public int ID;
    public string Name;
    public string Descript;
    public int Level;
    public int price;
​
}
[System.Serializable]//不知道要不要加?????
public class jsonToUse : MonoBehaviour
{   
    //建立json的类
    //1.获得json文件
    //2.获得文件的文字
    //3.解析json
    //4.校验是否正确 输出
​
    void Start()
    {
        TextAsset asset=Resources.Load<TextAsset>("Json/item");
        string json = asset.text;
​
        ItemJson d = JsonUtility.FromJson<ItemJson>(json);
        Debug.Log(d.Data[2].Name);
​
​
    }
​
    
}

3.使用方法



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
​
​
//特性
[System.Serializable]
public class ItemJson
{
    public List<item> Data;
}
​
//特性
[System.Serializable]
public class item
{
    public int ID;
    public string Name;
    public string Descript;
    public int Level;
    public int price;
​
}
[System.Serializable]//不知道要不要加?????
public class jsonToUse : MonoBehaviour
{   
    //建立json的类
    //1.获得json文件
    //2.获得文件的文字
    //3.解析json
    //4.校验是否正确 输出
​
    void Start()
    {
        TextAsset asset=Resources.Load<TextAsset>("Json/item");
        string json = asset.text;
​
        ItemJson d = JsonUtility.FromJson<ItemJson>(json);
        Debug.Log(d.Data[2].Name);
​
​
    }
​
    
}

 

成功!!!!!

但是不知道哪里需要使用特性

[System.Serializable]---是转换的json类,但是脚本需要添加吗?

litJson的引入

1.下载

 

2.删除其他内容,只留下c#文件

 

 

3.删除一句特性

报错---

jsonWriter文件

 

 

 

4.引入命名空间

using LitJson;//1.引入命名空间

litjson的使用

缺点:速度慢,但是编写比较好,json文件的外层结构是数组也是可以

例子

1.引入litjson
2.引入命名空间
3.使用类名JasonMapper
4.使用方法ToObejct<泛型>
5.校验是否正确
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;//引入命名空间
​
public class ItemRow
{
    public int ID;
    public string Name;
    public string Descript;
    public int Level;
    public int price;
}
​
​
public class litList : MonoBehaviour
{
    void Start()
    {   //获得resource文件夹下的json文件
        TextAsset asset = Resources.Load<TextAsset>("Json/LitJson/lit_list");
​
        //获得json文件的文本
        string json=asset.text;
​
        //使用litjson的jasonmapper类中的toObject方法,读出对应的类型(传入json文件)
        List<ItemRow> d = JsonMapper.ToObject<List<ItemRow>>(json);
​
        //打印出其中的数组的属性
        Debug.Log(d[2].Descript);
        //迷惑一分钟(暂停)
​
​
​
    }
​
​
}
//1.需要对应的c#类结构
//2.获得json文件
//3.获得json的文本;
//4.解析json
//5.打印json是否正确

 

 

成功!!!

litjson的使用-案例

1.数组类型

数组类型(int)

List<int>();

[11,5,69,22,68]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
​
public class SListInt : MonoBehaviour
{   
​
​
​
​
    // Start is called before the first frame update
    void Start()
    {
        textSListInt();
​
    }
    //int类型
    public void textSListInt()
    {
        TextAsset asset = Resources.Load<TextAsset>("Json/LitJson/SimpleList");     
        string json = asset.text;
        Debug.Log(json);
        List<int> d = JsonMapper.ToObject<List<int>>(json);
        Debug.Log(d[3]);
        //22
​
    }
​
​
}

 

数组类型(str)

["JACK","MARY","PETER","LOUIS","MARYNA","POLE"]

   
 public void textSListStr()
    {
        TextAsset asset = Resources.Load<TextAsset>("Json/LitJson/SimpleListStr");
        string json = asset.text;
        Debug.Log(json);
        List<string> d = JsonMapper.ToObject<List<string>>(json);
        Debug.Log(d[3]);
        //LOUIS
​
    }

 

2.对象类型

1.引入命名空间LITJSON

2.建立一个类,且属性名和json对应

3.解析json为类对象

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
​
public class Player
{
    public string Name;
    public int Age;
    public string Sex;
}
​
public class SObj : MonoBehaviour
{
​
    // Start is called before the first frame update
    void Start()
    {
        TextAsset asset = Resources.Load<TextAsset>("Json/LitJson/SimpleObj");
        string json = asset.text;
        Player p = JsonMapper.ToObject<Player>(json);
        Debug.Log(p.Name);
        //JACK
    }
​
    
}

 

3.字典类型

Distionary<string,int>

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
​
public class Dic : MonoBehaviour
{   
    
    // Start is called before the first frame update
    void Start()
    {
        TextAsset assest = Resources.Load<TextAsset>("Json/LitJson/Dic");
        string json = assest.text;//报错 bug路径文件名写错了
        Dictionary<string, string> dic = JsonMapper.ToObject<Dictionary<string, string>>(json);
        Debug.Log(dic["Grade"]);
        //三年级
​
​
​
    }
        
}

注意:

Dictionary<string, string>
​
dic["Grade"]
字典的访问是键的类型是string

 

4.数组套对象类型

public class ItemRow
{
    public int ID;
    public string Name;
    public string Descript;
    public int Level;
    public int price;
}
//对象对应的映射关系
​
//数组类型泛型是对象
 List<ItemRow> d = JsonMapper.ToObject<List<ItemRow>>(json);
​
​
//对象套数组(数组套对象)
[{
    "ID": 1,
    "Name": "大刀",
    "Descript": "可以涮敌人两个Hp",
    "Level": 3,
    "price": 3
},
{
    "ID": 2,
    "Name": "皇荒杖",
    "Descript": "可以积分,和打怪",
    "Level": 2,
    "price": 2
},
{
    "ID": 3,
    "Name": "雨霖铃",
    "Descript": "迷惑一分钟(暂停)",
    "Level": 3,
    "price": 2
},
{
    "ID": 4,
    "Name": "补气丹",
    "Descript": "可以补充1个HP",
    "Level": 1,
    "price": 1
}
]

案例

 

[{
    "ID": 1,
    "Name": "大刀",
    "Descript": "可以涮敌人两个Hp",
    "Level": 3,
    "price": 3
},
{
    "ID": 2,
    "Name": "皇荒杖",
    "Descript": "可以积分,和打怪",
    "Level": 2,
    "price": 2
},
{
    "ID": 3,
    "Name": "雨霖铃",
    "Descript": "迷惑一分钟(暂停)",
    "Level": 3,
    "price": 2
},
{
    "ID": 4,
    "Name": "补气丹",
    "Descript": "可以补充1个HP",
    "Level": 1,
    "price": 1
}
]

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;//1.引入命名空间
​
//1.需要对应的c#类结构
//2.获得json文件
//3.获得json的文本;
//4.解析json
//5.打印json是否正确
public class ItemRow
{
    public int ID;
    public string Name;
    public string Descript;
    public int Level;
    public int price;
}
​
​
public class litList : MonoBehaviour
{
   
    void Start()
    {   //获得resource文件夹下的json文件
        TextAsset asset = Resources.Load<TextAsset>("Json/LitJson/lit_list");
​
        //获得json文件的文本
        string json=asset.text;
​
        //使用litjson的jasonmapper类中的toObject方法,读出对应的类型(传入json文件)
        List<ItemRow> d = JsonMapper.ToObject<List<ItemRow>>(json);
​
        //打印出其中的数组的属性
        Debug.Log(d[2].Descript);
​
​
​
    }
​
   
}
​

5.数组套字典

1.建立json文件
2.获取资源
3.访问字典的内容

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
​
public class ListDic : MonoBehaviour
{   
   
    void Start()
    {
        TextAsset assest = Resources.Load<TextAsset>("Json/litJson/ListDic");
        string json = assest.text;
        List<Dictionary<string, string>> litdic = JsonMapper.ToObject<List<Dictionary<string, string>>>(json);
        Debug.Log(litdic[2]["Grade"]);
        //七年级
    }
​
​
}

 

6.对象套数组(数组套对象)

对象套数组
    1.建立对象
    2.建立对象的属性是list《属性类类型》
    3.建立这个里面的属性的类
​

 

​
{"Data":
[{
    "ID": 1,
    "Name": "大刀",
    "Descript": "可以涮敌人两个Hp",
    "Level": 3,
    "price": 3
},
{
    "ID": 2,
    "Name": "皇荒杖",
    "Descript": "可以积分,和打怪",
    "Level": 2,
    "price": 2
},
{
    "ID": 3,
    "Name": "雨霖铃",
    "Descript": "迷惑一分钟(暂停)",
    "Level": 3,
    "price": 2
},
{
    "ID": 4,
    "Name": "补气丹",
    "Descript": "可以补充1个HP",
    "Level": 1,
    "price": 1
}
]}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
public class PlayData
{
    public List<PLayerInfo> Data;
​
}
public class PLayerInfo
{
    public int ID;
    public string Name;
    public string Descript;
    public int Level;
    public int price;
}
​
public class ObjList : MonoBehaviour
{  
    void Start()
    {
        TextAsset asset = Resources.Load<TextAsset>("Json/LitJson/ObjList");
        string json = asset.text;
        Debug.Log("拿到json的文本内容");
​
        PlayData pd = JsonMapper.ToObject<PlayData>(json);//报错 因为json文件没有内容
        Debug.Log(pd.Data[2].Name);
        //雨霖铃
       
        
        
        //可以积分,和打怪
    }
​
​
}
//对象套数组
//1.建立对象
//2.建立对象的属性是list《属性类类型》
//3.建立这个里面的属性的类

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昆仲被投企业「鲲游光电」近期完成新一轮数亿元融资,继续致力于探索前沿光电子领域产品与创新应用|昆仲·链

鲲游光电(North Ocean Photonics)是专注于晶圆级光学、光集成领域的高科技企业&#xff0c;总部位于中国上海。依托自身深厚的技术积累、高精度的制造工艺&#xff0c;鲲游光电通过融合集成光学与集成电路的创新思路&#xff0c;致力于探索前沿光子、光电子领域的实现与创新应用…

MyBatis环境搭建配置、增删改查操作、分页、事务操作、动态SQL、缓存机制、注解开发

MyBatis 文章目录 MyBatisXML语言简介用途各部分注解声明元素属性注释CDATA转义字符 搭建环境读取实体类创建实体与映射关系的文件 配置MyBatis创建工具类接口实现 Mybatis工作流程增删改查指定映射规则指定构造方法字段名称带下划线处理条件查询插入数据复杂查询和事务一对多查…

Codeforces Round 860 (Div. 2)

A Showstopper 题意&#xff1a;给你两个长度为n的数组a和b&#xff0c;每次操作你可以互换a[i]与b[i]&#xff0c;问最终能否满足 思路&#xff1a;若a[i]>b[i]&#xff0c;我们就进行操作。这样数组b元素都是较大的&#xff0c; 一定比不操作更优。最后判断是否满足条件…

Python中的异常处理机制

什么是异常与异常处理 异常就是错误 异常会导致程序崩溃并停止运行 能监控并捕获到异常&#xff0c;将异常部位的程序进行修理使得程序继续正常运行 异常的语法结构 try:<代码块1> 被try关键字检查并保护的业务代码except <异常的类型>:<代码块2> # 代码…

Mybatis源码细节探究:sqlSessionFactory.openSession()这个方法到底发生了什么?

给自己的每日一句 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽…

【笔记】【Javascript】浅面了解原型和原型链

前言 原型和原型链是学习前端必备知识笔记中有些个人理解后整理的笔记&#xff0c;可能有所偏差&#xff0c;也恳请读者帮忙指出&#xff0c;谢谢。 免责声明 为了方便&#xff0c;本文中使用的部分图片来自于网络&#xff0c;如有侵权,请联系博主进行删除&#xff0c;感谢其…

C++ 二分查找法 LeetCode:704. 二分查找

class Solution { public:int search(vector<int>& nums, int target) {int length nums.size();//计算容器长度int left 0;//0int right length-1;//5int middle 0;/*while(left<right){middle (leftright)/2;//middle (leftright)>>1;if(nums[middl…

mysql子查询嵌套

目录 前言 一、实际需求解决 1.方式1&#xff1a;自连接 2.方式2&#xff1a;子查询 二、单行子查询 1.操作符子查询 三、相关子查询 四、自定义语句 五、子查询的问题 1.空值问题 2.非法使用子查询 六、多行子查询 七、聚合函数的嵌套使用 八、多行子查询空值问题…

Python爬虫实战——获取指定博主所有专栏链接及博文链接

Python爬虫实战——获取指定博主所有专栏链接及博文链接 0. 前言1. 第三方库的安装2. 代码3. 演示效果 0. 前言 本节学习使用爬虫来爬取指定csdn用户的所有专栏下的文章 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;Pycahrm Comunity 2022.3 Python解释器版…

带你学C带你飞-P16拾遗

自增运算符 #include <stdio.h> int main() {int i5,j;j i;printf("i%d,j%d",i,j);i5;ji;printf("i%d,j%d",i,j); }i:先使用i的值&#xff0c;再对i自身进行加一 i&#xff1a;先对i自身加一&#xff0c;再赋值给j 逗号运算符 条件运算符 三目运…

【Linux】冯诺依曼体系结构、操作系统概念、进程概念

文章目录 前言一、冯诺依曼体系结构1.简介冯诺依曼体系2.CPU3.存储器3.IO&#xff08;输入输出&#xff09;4.总结 二、操作系统&#xff08;OS&#xff09;1.操作系统是什么&#xff1f;2.为什么有操作系统&#xff1f;&#xff08;功能&#xff09;3.操作系统如何实现功能&am…

MySQL之触发器相关操作

1. 概念 触发器&#xff0c;就是⼀种特殊的存储过程。触发器和存储过程⼀样是⼀个能够完成特定功能、存储 在数据库服务器上的SQL⽚段&#xff0c;但是触发器⽆需调⽤&#xff0c;当对数据表中的数据执⾏DML操作时 ⾃动触发这个SQL⽚段的执⾏&#xff0c;⽆需⼿动调⽤。 在MyS…

前端食堂技术周刊第 83 期:TS 5.1 RC、Nuxt 3.5、INP、Kinp、管理 GitHub 通知、WebXR

By Midjournery 美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;杏花乌龙拿铁 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 TypeScript 5.1 RCNuxt 3.5INP 将成为新的 Core Web…

【LeetCode232】用栈模拟实现队列

你好&#xff0c;欢迎来到我的博客&#xff01;作为一名程序员&#xff0c;我经常刷LeetCode题目来提升自己的编程能力。在我的博客里&#xff0c;我会分享一些我自己做过的题目和解题思路&#xff0c;希望能够帮助到大家。今天&#xff0c;我想和大家分享一道挑战性较高的题目…

【牛客刷题专栏】0x29:JZ31 栈的压入、弹出序列(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…

周赛346(括号匹配问题变形、双指针、模拟/打表预处理+DFS)

文章目录 周赛346[2696. 删除子串后的字符串最小长度](https://leetcode.cn/problems/minimum-string-length-after-removing-substrings/)暴力模拟使用栈 [2697. 字典序最小回文串](https://leetcode.cn/problems/lexicographically-smallest-palindrome/)双指针 [2698. 求一个…

开放原子训练营(第三季)inBuilder低代码开发实验室之低代码浪潮已至

目录 、前言&#xff1a; 一、为什么选择它 二、小试牛刀 3.1设计源数据 3.2设计页面 3.3发布应用 四、总结 、前言&#xff1a; 当你还在沉浸于AI和大数据浪潮带来的影响时&#xff0c;另一种低代码或0代码的编程方式在市场流行&#xff0c;截止至2023年&#xff0c;低代码的浪…

浅浅谈谈ssm的那些事儿外加AOP和DI+DAO思想的理解和处理json数据的第三方工具

MyBatis 一级缓存 默认是打开的 SqlSession级别的缓存&#xff0c;同一个SqlSession的发起多次同构查询&#xff0c;会将数据保存在一级缓存中。 在sqlsession 中有一个数据结构 是map 结构&#xff0c; 这个区域就是一级缓存区域&#xff0c;一级缓存区域中的 key 是由 sql 语…

11.Mysql内核语句优化规则详解

MySQL性能调优 1. 条件化简1.1 移动不必要的括号1.2 常量传递1.3 移动没用的条件1.4 表达式计算1.5 常量表检测 2. 外连接消除3. 子查询MySQL内部优化规则3.1 子查询语法3.1.1 按返回的结果集区分子查询标量子查询行子查询列子查询表子查询 3.1.2 按与外层查询关系来区分子查询…

20230522打开cv1826的buildroot的内核的早期打印的功能

20230522打开cv1826的buildroot的内核的早期打印的功能 在CV1826的buildroot启动的时候&#xff0c;有些内核打印/printk显示不了。 大概在内核时间3-4s秒钟的前后&#xff0c;有一段内核打印丢失了&#xff01; 在CV1826的buildroot启动到uboot的时候&#xff0c;按ctrlC组合…