JSON学习笔记

一,学习JSON

1.JSON样式一:

1
{   "name" "runoob" ,   "alexa" :10000,   "site" null ,   "sites" :[   "Google" ,   "Runoob" ,   "Taobao"  ] }

2.JSON样式二(JSON 对象中可以包含另外一个 JSON 对象):

1
2
3
4
5
6
7
8
9
myObj={
    "name" "runoob" ,
    "alexa" :10000,
    "sites" : {
        "site1" "www.runoob.com" ,
        "site2" "m.runoob.com" ,
        "site3" "c.runoob.com"
     }
}注:访问方式:x = myObj.sites.site1;   // 或者 x = myObj.sites["site1"];  修改值方式:myObj.sites.site1 = "www.google.com"; // 或者 myObj.sites["site1"] = "www.google.com";  删除对象方式:delete myObj.sites.site1; // 或者 delete myObj.sites["site1"];

3.JavaScript获取JSON里对应值的方法

var myObj, x;
myObj = { "name":"runoob", "alexa":10000, "site":null };
x = myObj["name"];

4.JavaScript遍历JSON值的方法

var myObj = { "name":"runoob", "alexa":10000, "site":null }; 
for (x in myObj) {
  document.getElementById("demo").innerHTML += myObj[x] + "<br>";
}

5.JSON.parse(): 将一个 JSON 字符串转换为 JavaScript 对象。

JSON.parse(text[, reviver])
参数说明:text:必需,一个有效的JSON字符串
reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。
<p id="demo"></p>
<script> 
var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
document.getElementById("demo").innerHTML = obj.name + ":" + obj.site;
</script>

6.JSON.stringify(): 于将 JavaScript 值转换为 JSON 字符串。

JSON.stringify(value[, replacer[, space]])
value:
  必需, 要转换的 JavaScript 值(通常为对象或数组)。
replacer:
  可选,用于转换结果的函数或数组。如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。
space:
  可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t
var obj ={"name":"runoob","alexa":10000,"site":"www.runoob.com"};
var myJSON = JSON.stringify(obj);
document.getElementById("demo").innerHTML = myJSON;

二,学习Json Schema

  Json Schema 模式是一种基于JSON格式定义,JSON数据结构的规范。
1.Json schema 格式
复制代码
 1 {
 2     "$schema": "http://json-schema.org/draft-04/schema#",
 3     "title": "Product",
 4     "description": "A product from Acme's catalog",
 5     "type": "object",
 6     "properties": {
 7         "id": {
 8             "description": "The unique identifier for a product",
 9             "type": "integer"
10         },
11         "name": {
12             "description": "Name of the product",
13             "type": "string"
14         },
15         "price": {
16             "type": "number",
17             "minimum": 0,
18             "exclusiveMinimum": true
19         }
20     },
21     "required": ["id", "name", "price"]
22 }
复制代码

格式分析:

$schema 描述
$schema $schema 关键字状态,表示这个模式与 v4 规范草案书写一致。
title 标题,用来描述结构
description 描述
type 类型
properties 定义属性
required 必需属性

(1)object类型的关键字

type 类型 
properties 定义属性
required 必需属性
maxProperties 最大属性个数
minProperties 最小属性个数

(2)array的属性

items array 每个元素的类型 
minItems 约束属性,数组最小的元素个数
maxItems 约束属性,数组最大的元素个数
uniqueItems 约束属性,每个元素都不相同
additionalProperties 约束items的类型,不建议使用
Dependencies 属性依赖

(3)string的属性

maxLength 定义字符串的最大长度,>=0 
minLength 定义字符串的最小长度,>=0
pattern 用正则表达式约束字符串

(4)integer的属性

minimum 最小值
exclusiveMinimum 如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上大于 "minimum" 的值则实例有效。
maximum 约束属性,最大值
exclusiveMaximum 如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上小于 "maximum" 的值则实例有效。
multipleOf 是某数的倍数,必须大于0的整数

(5)number的属性

minimum 最小值
exclusiveMinimum 如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上大于 "minimum" 的值则实例有效。
maximum 约束属性,最大值
exclusiveMaximum 如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上小于 "maximum" 的值则实例有效。

(6)boolean的属性

true or false

(7)enum,null

2.Json schema 应用关键字

 (1)$ref 用来引用其它schema

"items": { "$ref": "#/definitions/positiveInteger" },2)allOf 展示全部属性
(3)anyOf 展示任意属性
(4)oneOf 其中之一
(5)not 非 * 类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
"allOf" : [
    {   "$ref" :   "#/definitions/address" },
    {   "properties" : {  "type" : {   "enum" : [   "residential" ,   "business" ] }}}
  ]
 "anyOf" : [
    {   "type" :   "string" },
    {   "type" :   "number" }
  ]
  "oneOf" : [
    {   "type" :   "number" ,   "multipleOf" : 5 },
    {   "type" :   "number" ,   "multipleOf" : 3 }
  ]
  "not" : {   "type" :   "string" }
}

2.1.Json schema 应用关键字-definitions

  当一个schema写的很大的时候,可能需要创建内部结构体,再使用$ref进行引用,示列如下

1
2
3
4
5
6
7
8
9
10
11
{
    "type" :   "array" ,
    "items" : {   "$ref" :   "#/definitions/positiveInteger" },
    "definitions" : {
        "positiveInteger" : {
            "type" :   "integer" ,
            "minimum" : 0,
            "exclusiveMinimum" :   true
        }
    }
}

三,C#读写JSON文件

0.JSON文件

1
2
3
4
5
6
7
{
  "FormsTitle" :   "CWSL" ,
  "SupplierName" :   "济南医疗设备有限公司" ,
  "InboundDate" :   "2020-06-10" ,
  "ReceiptNo" :   "10462740" ,
  "TotalAmount" :   "987.5"
} 

1.读取(废弃,请使用序列化方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 读取<br>       private void button1_Click(object sender, EventArgs e)
 {
     StreamReader reader = File.OpenText(  @"C:\Users\source\CWSL.json" );    // 读取文件
     JsonTextReader jsonTextReader =   new JsonTextReader(reader);       // 文件浏览
     JObject jsonObject = (JObject)JToken.ReadFrom(jsonTextReader);    // json文件解读
     string server = jsonObject[  "SupplierName" ].ToString() +   " " ;
     server = server + jsonObject[  "InboundDate" ].ToString() +   " " ;
     server = server + jsonObject[  "ReceiptNo" ].ToString() +   " " ;
     server = server + jsonObject[  "TotalAmount" ].ToString() +   " " ;
     server = server + jsonObject[  "AcceptanceOfThePeople" ].ToString() +   " " ;
     server = server + jsonObject[  "Supplier" ].ToString() +   " " ;
     server = server + jsonObject[  "WarehouseOperator" ].ToString() +   " " ;
     System.Diagnostics.Debug.WriteLine(server);    // 输出server值
     reader.Close();
 }

2.序列化与反序列化方法:

   a.有实体:

复制代码
1 1.SerializeObject();  // 序列化
2 // json 序列化后的字符串
3 // rslt 实体类
4 string json = JsonConvert.SerializeObject(rslt);//序列化
5 
6 2.DeserializeObject();  // 反序列化
7 // Response 实体类
8 // json 序列化后的字符串
9 Response rslt1 = JsonConvert.DeserializeObject<Response>(json);//反序列化
复制代码

   b.无实体-反序列化

1 JObject jo = (JObject)JsonConvert.DeserializeObject(html);  // 反序列化为json
2 if (jo != null)
3 {
4       if (jo["code"].ToString() == "100000")
5       {
6             return jo["text"].ToString();
7       }
8 }

3.读取json文件的方法

  a.第一版

复制代码
 1 Config config = new Config();
 2 
 3 string configStr = JsonfileTools.Readjson("SendDataZCCAconfig.json");
 4 config = JsonConvert.DeserializeObject<Config>(configStr);
 5 
 6         /// <summary>
 7         /// 读取同目录下JSON文件
 8         /// </summary>
 9         /// <param name="key">JSON文件中的key值</param>
10         /// <returns>JSON文件中的value值</returns>
11         public static string Readjson(string fileName)
12         {
13             using (System.IO.StreamReader file = System.IO.File.OpenText(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + fileName))
14             {
15                return file.ReadToEnd();
16             }
17         }
复制代码

  b.第二版,改成泛型:

复制代码
 1 Config config = new Config();
 2 config= JsonfileTools.ReadjsonT<Config>("SendDataZCCAconfig.json");
 3   /// <summary>
 4   /// 读取同目录下JSON文件
 5   /// </summary>
 6   /// <typeparam name="T">返回的类型</typeparam>
 7   /// <param name="fileName">打开的文件名</param>
 8   /// <returns>实体类</returns>
 9   public static T ReadjsonT<T> (string fileName)
10   {
11       using (System.IO.StreamReader file = System.IO.File.OpenText(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + fileName))
12       {
13           return JsonConvert.DeserializeObject<T>(file.ReadToEnd());
14       }
15   }
复制代码

4.保存json文件的泛型方法

复制代码
 1   /// <summary>
 2         /// 写入同目录下JSON文件
 3         /// </summary>
 4         /// <typeparam name="T"></typeparam>
 5         /// <param name="fileName">保存使用的文件名</param>
 6         /// <param name="tParameter">实体类</param>
 7         /// <returns>成功状态</returns>
 8         public static bool WritejsonT<T>(string fileName, T tParameter)
 9         {
10             string fp = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + fileName;
11             try
12             {
13                 File.WriteAllText(fp, JsonConvert.SerializeObject(tParameter));  // 覆盖写入
14                 return true;
15             }
16             catch
17             {
18                 return false;
19             }
20         }
复制代码

5.修改Value通过Key

        /// <summary>
        /// 修改Value通过Key
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <param name="key">需要修改的key</param>
        /// <param name="value">更改为的值</param>
        /// <returns></returns>
        public static void ModifyValueByKey(string filePath, string key, string value)
        {
            if (!File.Exists(filePath))
            {
                throw new Exception("需要修改的json文件不存在!");
            }
            string jsonStr = File.ReadAllText(filePath, Encoding.UTF8); // 读取文件流

            JObject json = JObject.Parse(jsonStr);  // 解析成json
            json[key] = value;  // 修改需要修改的字段

            jsonStr = Convert.ToString(json);
            File.WriteAllText(filePath, jsonStr, Encoding.UTF8);
        }
posted @   ꧁执笔小白꧂  阅读(450)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示