ASP.NET之JSONHelper操作

news/2025/4/19 2:59:52/文章来源:https://www.cnblogs.com/qigege/p/18204797
之前说到了Ext.Net中GridPanel行取值的问题(Ext.Net开发_GridPanel行选中取值),涉及到checkBox操作时,要留个心眼注意下取值的区别!返回值是Json格式。 现在用到了Json,就想自己也整一个Josn帮助类。在线帮助的资料很多,在巨人的身上东凑西凑也凑一个用用。   

 

一、介绍

  JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集

 

  方法有多种,我这边用到是DataContractJsonSerializer类,官方解释:“NET Framework 4 .NET Framework 3.5 Silverlight 将对象序列化为 JavaScript 对象表示法 (JSON),并将 JSON 数据反序列化为对象”。

 

  其命名空间如下:

 

 

  注意:如果是.NET Framework 3.5  光引用了“System.Runtime.Serialization”了这个还不行。运行时会发现:

 

 

 

所以还要引用下“System.ServiceModel.Web”即可。   .NET Framework 4则在System.Runtime.Serialization下。

 

二、对JSON数据操作

 源码:

复制代码
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.Script.Serialization;
using System.Collections.Generic;
using System.Runtime.Serialization.Json;
namespace WebUI.CommonClass
{
public class JSONHelper
{

/// <summary>
/// JSON序列化
/// </summary>
public static string JsonSerializer<T>(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
//替换Json的Date字符串
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
return jsonString;
}

/// <summary>
/// JSON反序列化
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{
//将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}

/// <summary>
/// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
/// </summary>
private static string ConvertJsonDateToDateString(Match m)
{
string result = string.Empty;
DateTime dt = new DateTime(1970, 1, 1);
dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
dt = dt.ToLocalTime();
result = dt.ToString("yyyy-MM-dd HH:mm:ss");
return result;
}

/// <summary>
/// 将时间字符串转为Json时间
/// </summary>
private static string ConvertDateStringToJsonDate(Match m)
{
string result = string.Empty;
DateTime dt = DateTime.Parse(m.Groups[0].Value);
dt = dt.ToUniversalTime();
TimeSpan ts = dt - DateTime.Parse("1970-01-01");
result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds);
return result;
}
}
}
复制代码


实验下:

Product

复制代码
    public class Product
{
public string proName { get ;set ; }
public decimal proPrice { get; set; }
public string proAttr { get; set; }
public string proAddres { get; set; }
}
复制代码

操作

1:序列化

复制代码
Product pro = new Product();
pro.proAddres = "上海";
pro.proAttr = "cpu";
pro.proName = "电脑";
pro.proPrice = 3680;
string josn = JSONHelper.JsonSerializer<Product>(pro); //序列化
Message.ShowAlert("提示", josn);
复制代码

效果:


2,反序列化

string json = "{\"proAddres\":\"上海\",\"proAttr\":\"cpu\",\"proName\":\"电脑\",\"proPrice\":3680}";
Product pro = JSONHelper.JsonDeserialize<Product>(json);

 

 


 

 

 

  JSONHELP

  

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
using System.Collections;
using System.Data;
using System.Text;
using System.Reflection;
using System.Globalization;
using System.Text.RegularExpressions;namespace FumaCRM_BS.NewWeb.Common.Class
{public class JsonHelper{/// <summary>/// DataTable转Json/// </summary>/// <param name="dtb"></param>/// <returns></returns>public static string Dtb2Json(DataTable dtb){JavaScriptSerializer jss = new JavaScriptSerializer();ArrayList dic = new ArrayList();foreach (DataRow row in dtb.Rows){Dictionary<string, object> drow = new Dictionary<string, object>();foreach (DataColumn col in dtb.Columns){drow.Add(col.ColumnName, row[col.ColumnName]);}dic.Add(drow);}return jss.Serialize(dic);}/// <summary>/// Json转DataTable/// </summary>/// <param name="json"></param>/// <returns></returns>public static DataTable Json2Dtb(string json){JavaScriptSerializer jss = new JavaScriptSerializer();ArrayList dic = jss.Deserialize<ArrayList>(json);DataTable dtb = new DataTable();if (dic.Count > 0){foreach (Dictionary<string, object> drow in dic){if (dtb.Columns.Count == 0){foreach (string key in drow.Keys){//if (drow[key].GetType() != null)//    dtb.Columns.Add(key, drow[key].GetType());//else
                                dtb.Columns.Add(key);}}DataRow row = dtb.NewRow();foreach (string key in drow.Keys){row[key] = drow[key];}dtb.Rows.Add(row);}}return dtb;}public static string DataTable2Json(DataTable dt){if (dt == null || dt.Rows.Count == 0)return "[]";StringBuilder jsonBuilder = new StringBuilder();jsonBuilder.Append("[");for (int i = 0; i < dt.Rows.Count; i++){jsonBuilder.Append("{");for (int j = 0; j < dt.Columns.Count; j++){jsonBuilder.Append("\"");jsonBuilder.Append(dt.Columns[j].ColumnName);jsonBuilder.Append("\":\"");string value = dt.Rows[i][j].ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "").Trim();if (dt.Columns[j].DataType.FullName == "System.DateTime")jsonBuilder.Append(value.Length == 0 ? value : Convert.ToDateTime(value).ToString("yyyy-MM-dd"));elsejsonBuilder.Append(value);jsonBuilder.Append("\",");}jsonBuilder.Remove(jsonBuilder.Length - 1, 1);jsonBuilder.Append("},");}jsonBuilder.Remove(jsonBuilder.Length - 1, 1);jsonBuilder.Append("]");return jsonBuilder.ToString();}#region JqueryEasyUI JSON  Method/// <summary>/// 生成表单编辑赋值 JSON格式/// </summary>/// <param name="dt"></param>/// <param name="displayCount"></param>/// <returns></returns>public static string CreateJsonOne(DataTable dt, bool displayCount){StringBuilder JsonString = new StringBuilder();//Exception Handling        if (dt != null && dt.Rows.Count > 0){for (int i = 0; i < dt.Rows.Count; i++){JsonString.Append("{ ");for (int j = 0; j < dt.Columns.Count; j++){if (j < dt.Columns.Count - 1){JsonString.Append("ipt_" + dt.Columns[j].ColumnName.ToString().ToLower() + ":" + "\"" + dt.Rows[i][j].ToString() + "\",");}else if (j == dt.Columns.Count - 1){JsonString.Append("ipt_" + dt.Columns[j].ColumnName.ToString().ToLower() + ":" + "\"" + dt.Rows[i][j].ToString() + "\"");}}if (i == dt.Rows.Count - 1){JsonString.Append("} ");}else{JsonString.Append("}, ");}}return JsonString.ToString();}else{return null;}}/// <summary>/// 将DataTable中的数据转换成JSON格式/// </summary>/// <param name="dt">数据源DataTable</param>/// <param name="displayCount">是否输出数据总条数</param>/// <returns></returns>public static string CreateJsonParameters(DataTable dt, bool displayCount){return CreateJsonParameters(dt, displayCount, dt.Rows.Count);}/// <summary>/// 将DataTable中的数据转换成JSON格式/// </summary>/// <param name="dt">数据源DataTable</param>/// <returns></returns>public static string CreateJsonParameters(DataTable dt){return CreateJsonParameters(dt, true);}/// <summary>/// 将DataTable中的数据转换成JSON格式/// </summary>/// <param name="dt">数据源DataTable</param>/// <param name="displayCount">是否输出数据总条数</param>/// <param name="totalcount">JSON中显示的数据总条数</param>/// <returns></returns>public static string CreateJsonParameters(DataTable dt, bool displayCount, int totalcount){StringBuilder JsonString = new StringBuilder();//Exception Handling        if (dt != null){JsonString.Append("{ ");JsonString.Append("\"rows\":[ ");for (int i = 0; i < dt.Rows.Count; i++){JsonString.Append("{ ");for (int j = 0; j < dt.Columns.Count; j++){if (j < dt.Columns.Count - 1){//if (dt.Rows[i][j] == DBNull.Value) continue;if (dt.Columns[j].DataType == typeof(bool)){JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" +dt.Rows[i][j].ToString().ToLower() + ",");}else if (dt.Columns[j].DataType == typeof(string)){JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" +dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\",");}else{JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\",");}}else if (j == dt.Columns.Count - 1){//if (dt.Rows[i][j] == DBNull.Value) continue;if (dt.Columns[j].DataType == typeof(bool)){JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" +dt.Rows[i][j].ToString().ToLower());}else if (dt.Columns[j].DataType == typeof(string)){JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" +dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\"");}else{JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\"");}}}/*end Of String*/if (i == dt.Rows.Count - 1){JsonString.Append("} ");}else{JsonString.Append("}, ");}}JsonString.Append("]");if (displayCount){JsonString.Append(",");JsonString.Append("\"total\":");JsonString.Append(totalcount);}JsonString.Append("}");return JsonString.ToString().Replace("\n", "");}else{return null;}}#region object 2 jsonprivate static void WriteDataRow(StringBuilder sb, DataRow row){sb.Append("{");foreach (DataColumn column in row.Table.Columns){sb.AppendFormat("\"{0}\":", column.ColumnName);WriteValue(sb, row[column]);sb.Append(",");}// Remove the trailing comma.if (row.Table.Columns.Count > 0){--sb.Length;}sb.Append("}");}private static void WriteDataSet(StringBuilder sb, DataSet ds){sb.Append("{\"Tables\":{");foreach (DataTable table in ds.Tables){sb.AppendFormat("\"{0}\":", table.TableName);WriteDataTable(sb, table);sb.Append(",");}// Remove the trailing comma.if (ds.Tables.Count > 0){--sb.Length;}sb.Append("}}");}private static void WriteDataTable(StringBuilder sb, DataTable table){sb.Append("{\"Rows\":[");foreach (DataRow row in table.Rows){WriteDataRow(sb, row);sb.Append(",");}// Remove the trailing comma.if (table.Rows.Count > 0){--sb.Length;}sb.Append("]}");}private static void WriteEnumerable(StringBuilder sb, IEnumerable e){bool hasItems = false;sb.Append("[");foreach (object val in e){WriteValue(sb, val);sb.Append(",");hasItems = true;}// Remove the trailing comma.if (hasItems){--sb.Length;}sb.Append("]");}private static void WriteHashtable(StringBuilder sb, IDictionary e){bool hasItems = false;sb.Append("{");foreach (string key in e.Keys){sb.AppendFormat("\"{0}\":", key.ToLower());WriteValue(sb, e[key]);sb.Append(",");hasItems = true;}// Remove the trailing comma.if (hasItems){--sb.Length;}sb.Append("}");}private static void WriteObject(StringBuilder sb, object o){MemberInfo[] members = o.GetType().GetMembers(BindingFlags.Instance | BindingFlags.Public);sb.Append("{");bool hasMembers = false;foreach (MemberInfo member in members){bool hasValue = false;object val = null;if ((member.MemberType & MemberTypes.Field) == MemberTypes.Field){FieldInfo field = (FieldInfo)member;val = field.GetValue(o);hasValue = true;}else if ((member.MemberType & MemberTypes.Property) == MemberTypes.Property){PropertyInfo property = (PropertyInfo)member;if (property.CanRead && property.GetIndexParameters().Length == 0){val = property.GetValue(o, null);hasValue = true;}}if (hasValue){sb.Append("\"");sb.Append(member.Name);sb.Append("\":");WriteValue(sb, val);sb.Append(",");hasMembers = true;}}if (hasMembers){--sb.Length;}sb.Append("}");}private static void WriteString(StringBuilder sb, IEnumerable s){sb.Append("\"");foreach (char c in s){switch (c){case '\"':sb.Append("\\\"");break;case '\\':sb.Append("\\\\");break;case '\b':sb.Append("\\b");break;case '\f':sb.Append("\\f");break;case '\n':sb.Append("\\n");break;case '\r':sb.Append("\\r");break;case '\t':sb.Append("\\t");break;default:int i = c;if (i < 32 || i > 127){sb.AppendFormat("\\u{0:X04}", i);}else{sb.Append(c);}break;}}sb.Append("\"");}public static void WriteValue(StringBuilder sb, object val){if (val == null || val == DBNull.Value){sb.Append("null");}else if (val is string || val is Guid){WriteString(sb, val.ToString());}else if (val is bool){sb.Append(val.ToString().ToLower());}else if (val is double ||val is float ||val is long ||val is int ||val is short ||val is byte ||val is decimal){sb.AppendFormat(CultureInfo.InvariantCulture.NumberFormat, "{0}", val);}else if (val.GetType().IsEnum){sb.Append((int)val);}else if (val is DateTime){sb.Append("new Date(\"");sb.Append(((DateTime)val).ToString("MMMM, d yyyy HH:mm:ss",new CultureInfo("en-US", false).DateTimeFormat));sb.Append("\")");}else if (val is DataSet){WriteDataSet(sb, val as DataSet);}else if (val is DataTable){WriteDataTable(sb, val as DataTable);}else if (val is DataRow){WriteDataRow(sb, val as DataRow);}else if (val is Hashtable){WriteHashtable(sb, val as Hashtable);}else if (val is IEnumerable){WriteEnumerable(sb, val as IEnumerable);}else{WriteObject(sb, val);}}/// <summary>/// /// </summary>/// <param name="o"></param>/// <returns></returns>public static string Convert2Json(object o){StringBuilder sb = new StringBuilder();WriteValue(sb, o);return sb.ToString();}#endregion#endregion/// <summary>/// 转换对象为JSON格式数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj">对象</param>/// <returns>字符格式的JSON数据</returns>public static string GetJSON<T>(object obj){string result = String.Empty;try{System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));using (System.IO.MemoryStream ms = new System.IO.MemoryStream()){serializer.WriteObject(ms, obj);result = System.Text.Encoding.UTF8.GetString(ms.ToArray());}}catch (Exception ex){throw ex;}return result;}/// <summary>/// 转换List<T>的数据为JSON格式/// </summary>/// <typeparam name="T"></typeparam>/// <param name="vals">列表值</param>/// <returns>JSON格式数据</returns>public static string JSON<T>(List<T> vals){System.Text.StringBuilder st = new System.Text.StringBuilder();try{System.Runtime.Serialization.Json.DataContractJsonSerializer s = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));foreach (T city in vals){using (System.IO.MemoryStream ms = new System.IO.MemoryStream()){s.WriteObject(ms, city);st.Append(System.Text.Encoding.UTF8.GetString(ms.ToArray()));}}}catch (Exception ex){throw ex;}return st.ToString();}/// <summary>/// JSON格式字符转换为T类型的对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="jsonStr"></param>/// <returns></returns>public static T ParseFormByJson<T>(string jsonStr){T obj = Activator.CreateInstance<T>();using (System.IO.MemoryStream ms =new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(jsonStr))){System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));return (T)serializer.ReadObject(ms);}}/// <summary>/// 将获取的Json数据转换为DataTable/// </summary>/// <param name="strJson">Json字符串</param>/// <returns></returns>public static DataTable JsonToDataTable(string strJson){//取出表名   var rg = new Regex(@"(?<={)[^:]+(?=:\[)", RegexOptions.IgnoreCase);string strName = rg.Match(strJson).Value;DataTable tb = null;//去除表名   strJson = strJson.Substring(strJson.IndexOf("[") + 1);strJson = strJson.Substring(0, strJson.IndexOf("]"));//获取数据   rg = new Regex(@"(?<={)[^}]+(?=})");MatchCollection mc = rg.Matches(strJson);for (int i = 0; i < mc.Count; i++){string strRow = mc[i].Value;string[] strRows = strRow.Split(',');//创建表   if (tb == null){tb = new DataTable();tb.TableName = strName;foreach (string str in strRows){var dc = new DataColumn();string[] strCell = str.Split(':');dc.ColumnName = strCell[0].Replace("\"", "");// strCell[0];
                        tb.Columns.Add(dc);}tb.AcceptChanges();}//增加内容   DataRow dr = tb.NewRow();for (int r = 0; r < strRows.Length; r++){dr[r] = strRows[r].Split(':')[1].Trim().Replace("", ",").Replace("", ":").Replace("\"", "");}tb.Rows.Add(dr);tb.AcceptChanges();}return tb;}/// <summary>/// /// </summary>/// <param name="strJson"></param>/// <param name="symbol"></param>/// <returns></returns>public static DataTable JsonToDataTable(string strJson, string symbol){//取出表名   var rg = new Regex(@"(?<={)[^:]+(?=:\[)", RegexOptions.IgnoreCase);string strName = rg.Match(strJson).Value;DataTable tb = null;//去除表名   strJson = strJson.Substring(strJson.IndexOf("[") + 1);strJson = strJson.Substring(0, strJson.IndexOf("]"));//获取数据   rg = new Regex(@"(?<={)[^}]+(?=})");MatchCollection mc = rg.Matches(strJson);for (int i = 0; i < mc.Count; i++){string strRow = mc[i].Value;string[] strRows = strRow.Replace(symbol, "|").Split('|');// (symbol);//创建表   if (tb == null){tb = new DataTable();tb.TableName = strName;foreach (string str in strRows){var dc = new DataColumn();string[] strCell = str.Split(':');dc.ColumnName = strCell[0].Replace("\"", "");// strCell[0];
                        tb.Columns.Add(dc);}tb.AcceptChanges();}//增加内容   DataRow dr = tb.NewRow();for (int r = 0; r < strRows.Length; r++){dr[r] = strRows[r].Split(':')[1].Trim().Replace("", ",").Replace("", ":").Replace("\"", "");}tb.Rows.Add(dr);tb.AcceptChanges();}return tb;}/// <summary>     /// dataTable转换成Json格式     /// </summary>     /// <param name="dt"></param>     /// <returns></returns>     public static string ToJson(DataTable dt){StringBuilder jsonBuilder = new StringBuilder();jsonBuilder.Append("{\"");jsonBuilder.Append(dt.TableName);jsonBuilder.Append("\":[");for (int i = 0; i < dt.Rows.Count; i++){jsonBuilder.Append("{");for (int j = 0; j < dt.Columns.Count; j++){jsonBuilder.Append("\"");jsonBuilder.Append(dt.Columns[j].ColumnName);jsonBuilder.Append("\":\"");jsonBuilder.Append(dt.Rows[i][j].ToString());jsonBuilder.Append("\",");}jsonBuilder.Remove(jsonBuilder.Length - 1, 1);jsonBuilder.Append("},");}jsonBuilder.Remove(jsonBuilder.Length - 1, 1);jsonBuilder.Append("]");jsonBuilder.Append("}");return jsonBuilder.ToString();}}
}
复制代码

 https://www.cnblogs.com/PEPE/archive/2012/02/13/Pepe_Yu.html

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git:warning: CALF wilL be replaced by LF in xxxx 问题解决

warning: CALF wilL be replaced by LF in xxxx 问题解决办法 出现这个问题的原因是像缓存区中提交文件时出现的 原因: windows中的换行符为 CRLF,而在Linux下的换行符为LF,所以在执行add . 时出现提示 也就是, 工作区的文件都应该用 CRLF 来换行。如果 改动文件时引入了 …

tar命令——压缩与解压

介绍 tar全称是tape archive,初衷是将多个文件写入磁带。首先,需要分清两个概念——打包与压缩。打包:将多个文件汇总成一个文件。压缩:将一个大文件通过压缩算法变成一个小文件。而tar命令执行的打包流程,真正执行压缩的是使用的压缩算法,比如gzip、bzip2、xz。tar命令在…

CF1515F Phoenix and Earthquake

CF1515F Phoenix and Earthquake 证明题。 思路 考虑不合法的情况,如果 \(\sum a_i < (n-1)\times x\),肯定是不合法的。 再考虑对于一个可行的情况,最后缩的边肯定形成一棵树,所以我们大胆假设:任意一棵生成树只要满足 \(\sum a_i \geq (n-1)\times x\) 有合法的缩边方…

密码爆破ssh与ftp服务(finish)

密码爆破ssh与ftp服务 使用工具九头蛇(hydra) ssh 环境配置 win10 安装sshd服务端在cmd命令行使用 net start sshd 命令启动服务kali 打开终端查看是否开启ssh服务 nmap -sV -T4 -p- [kali的ip] 先创建一个用户名字典username.txt,把经常用的用户名写入到字典中 touch usern…

Obsidian第三方插件下载

一、从Obsidian插件市场下载 使用第三方插件的第一步是关闭安全模式。点击“浏览”,搜索需要的插件名称。在这里输入名称搜索。点击安装。点击启用。必要时要使用魔法。 替代方法proxy-github二、从别的地方下载的插件 首先了解一下obsidian插件的基本构成,主要包括下面的文件…

鸿蒙4.2小版本大亮点,鸿蒙5.0也不远了

混合应用开发技术,特别是结合小程序和原生技术,为鸿蒙应用开发带来了显著的优势。首先,它简化了开发流程,使开发者能够迅速创建出高质量的应用程序。这不仅缩短了开发周期,还提升了应用的整体性能和用户体验。上个月,市场上迎来了华为鸿蒙系统4字开头的小升级,版本来到了…

急急急,求完全正确的快读板子!!!

急急急,求完全正确的快读板子!!!急急急,求完全正确的快读板子!!! 首先这其实是半篇题解。 关于染色这道题。 其实思路非常简单,只要想到树剖,之后用线段树去维护左右边界上的颜色以及区间答案即可。 只需注意pushup的时候要把左右边界颜色更新,转移时相邻区间看颜色…

JPA和Hibernate的乐观锁与悲观锁

哈喽,大家好,我是木头左!JPA和Hibernate的乐观锁和悲观锁 乐观锁 乐观锁是一种假设资源不会被冲突影响的并发控制策略。它假设多个事务在同一时间内不会发生冲突,因此不需要加锁。当事务提交时,如果检测到数据发生了改变,就会抛出异常,让开发者决定如何处理这个冲突。 在…