一.准备需转为DataTable的json字符串

原json字符串数据

[{"TechName":"ECN","TechNo":"EC_01","id":"1"},{"TechName":"流程指示","TechNo":"PI_01","id":"2"},{"TechName":"计划投料","TechNo":"FP_01","id":"3"},{"TechName":"开料","TechNo":"CC_01","id":"4"},{"TechName":"裁切","TechNo":"CC_02","id":"5"},{"TechName":"磨边","TechNo":"CC_03","id":"6"},{"TechName":"圆角","TechNo":"CC_04","id":"7"},{"TechName":"打标","TechNo":"CC_05","id":"8"},{"TechName":"烘板","TechNo":"CC_06","id":"9"},{"TechName":"钻孔","TechNo":"MD_02","id":"10"},{"TechName":"去毛刺","TechNo":"PT_01","id":"11"},{"TechName":"烘板","TechNo":"PT_05","id":"12"},{"TechName":"等离子处理","TechNo":"PT_02","id":"13"},{"TechName":"沉铜","TechNo":"PT_07","id":"14"},{"TechName":"负片电镀","TechNo":"PP_02","id":"15"},{"TechName":"磨板","TechNo":"PP_05","id":"16"},{"TechName":"外层前处理","TechNo":"OL_01","id":"17"},{"TechName":"贴膜","TechNo":"OL_03","id":"18"},{"TechName":"曝光","TechNo":"OL_04","id":"19"},{"TechName":"显影","TechNo":"OL_05","id":"20"},{"TechName":"酸性蚀刻","TechNo":"OL_06","id":"21"},{"TechName":"退膜","TechNo":"OL_07","id":"22"},{"TechName":"外层AOI","TechNo":"AO_04","id":"23"},{"TechName":"烘板","TechNo":"SM_02","id":"24"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"25"},{"TechName":"丝印","TechNo":"SM_05","id":"26"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"27"},{"TechName":"丝印","TechNo":"SM_05","id":"28"},{"TechName":"预烘","TechNo":"SM_06","id":"29"},{"TechName":"曝光","TechNo":"SM_09","id":"30"},{"TechName":"显影","TechNo":"SM_10","id":"31"},{"TechName":"终固化","TechNo":"SM_11","id":"32"},{"TechName":"喷砂","TechNo":"EN_01","id":"33"},{"TechName":"板边包胶","TechNo":"EN_02","id":"34"},{"TechName":"沉金","TechNo":"EN_04","id":"35"},{"TechName":"水洗烘干","TechNo":"EN_06","id":"36"},{"TechName":"铣板","TechNo":"FO_02","id":"37"},{"TechName":"成品清洗","TechNo":"FO_14","id":"38"},{"TechName":"小板切割","TechNo":"FO_08","id":"39"},{"TechName":"功能检查","TechNo":"FI_01","id":"40"},{"TechName":"外观检查","TechNo":"FI_02","id":"41"},{"TechName":"内包装","TechNo":"PK_01","id":"42"},{"TechName":"入库","TechNo":"DE_01","id":"43"},{"TechName":"外包装","TechNo":"DE_02","id":"44"},{"TechName":"出库","TechNo":"DE_03","id":"45"}] '

转换后的效果(横向)

转换后的效果(竖向)

二.C#写SQL SERVER(CLR) json转DataTable存储过程

利用Json反序列化为字典类型 Dictionary<string, object> key,value形式,然后再转为DataTable

  /// <summary>
/// Json转Table
/// </summary>
/// <param name="jsonString"></param>
/// <param name="isVerticalTable">是否竖表</param>
[Microsoft.SqlServer.Server.SqlProcedure]
public static void Json2Table(string jsonString, bool isVerticalTable)
{
SqlDataRecord dataRecord = new SqlDataRecord();
var ListObject = Json.Deserialize(jsonString) as List<object>;
var Object = Json.Deserialize(jsonString) as Dictionary<string, object>;
if (ListObject == null && Object == null)
return;
if (ListObject == null)
{
ListObject = new List<object>();
ListObject.Add(Object);
}
List<SqlMetaData> sqlMetaDatas = new List<SqlMetaData>();
Dictionary<string, object> KeyObject = (Dictionary<string, object>)ListObject[];
if (!isVerticalTable)
{
foreach (var jProperty in KeyObject)
{
sqlMetaDatas.Add(new SqlMetaData(jProperty.Key, SqlDbType.NVarChar, ));
}
dataRecord = new SqlDataRecord(sqlMetaDatas.ToArray());
SqlContext.Pipe.SendResultsStart(dataRecord);
for (int i = ; i < ListObject.Count(); i++)
{
Dictionary<string, object> DicObject = (Dictionary<string, object>)ListObject[i];
int j = ;
foreach (var item in KeyObject)
{
dataRecord.SetString(j, DicObject[item.Key].ToStringJson());
j++;
}
SqlContext.Pipe.SendResultsRow(dataRecord);
}
SqlContext.Pipe.SendResultsEnd();
}
else
{
dataRecord = new SqlDataRecord(new SqlMetaData[] { new SqlMetaData("id", SqlDbType.Int), new SqlMetaData("key", SqlDbType.NVarChar, ), new SqlMetaData("value", SqlDbType.NVarChar, ) });
SqlContext.Pipe.SendResultsStart(dataRecord);
for (int i = ; i < ListObject.Count(); i++)
{
Dictionary<string, object> DicObject = (Dictionary<string, object>)ListObject[i];
foreach (var item in DicObject)
{
dataRecord.SetInt32(, i + );
dataRecord.SetString(, item.Key.ToString());
dataRecord.SetString(, item.Value.ToStringJson());
SqlContext.Pipe.SendResultsRow(dataRecord);
}
}
SqlContext.Pipe.SendResultsEnd();
}
SqlContext.Pipe.Send("ok");
}
public static class StaticMethod
{
public static string ToStringJson(this object thisObject)
{
if (thisObject == null)
return "";
if (thisObject is Dictionary<string,object>)
return Json.Serialize(thisObject);
else if (thisObject is List<object>)
return Json.Serialize(thisObject);
return thisObject.ToString();
} }

开源MiniJSON类解析Json字符串

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text; namespace SQLClr
{
/// <summary>
/// This class encodes and decodes JSON strings.
/// Spec. details, see http://www.json.org/
///
/// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary.
/// All numbers are parsed to doubles.
/// </summary>
public static class Json
{
/// <summary>
/// Parses the string json into a value
/// </summary>
/// <param name="json">A JSON string.</param>
/// <returns>An List<object>, a Dictionary<string, object>, a double, an integer,a string, null, true, or false</returns>
//反序列化
public static object Deserialize(string json)
{
// save the string for debug information
if (json == null)
{
return null;
} return Parser.Parse(json);
}
//阻止其他类从该类继承
sealed class Parser : IDisposable
{
const string WORD_BREAK = "{}[],:\""; public static bool IsWordBreak(char c)
{
// 如果 c 是空白,则为 true;否则,为 false;报告指定 Unicode 字符在此字符串中的第一个匹配项的索引。
return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -;
} enum TOKEN
{
NONE,
CURLY_OPEN,
CURLY_CLOSE,
SQUARED_OPEN,
SQUARED_CLOSE,
COLON,
COMMA,
STRING,
NUMBER,
TRUE,
FALSE,
NULL
};
// 实现从字符串进行读取的 System.IO.TextReader。
StringReader json; Parser(string jsonString)
{
json = new StringReader(jsonString);
} public static object Parse(string jsonString)
{
using (var instance = new Parser(jsonString))
{
return instance.ParseValue();
}
}
//释放
public void Dispose()
{
json.Dispose();
json = null;
} Dictionary<string, object> ParseObject()
{
Dictionary<string, object> table = new Dictionary<string, object>(); // ditch opening brace
json.Read(); // {
while (true)
{
switch (NextToken)
{
case TOKEN.NONE:
return null;
case TOKEN.COMMA:
continue;
case TOKEN.CURLY_CLOSE:
return table;
default:
// name
string name = ParseString();
if (name == null)
{
return null;
} // :
if (NextToken != TOKEN.COLON)
{
return null;
}
// ditch the colon
json.Read(); // value
table[name] = ParseValue();
break;
}
}
} List<object> ParseArray()
{
List<object> array = new List<object>(); // ditch opening bracket
json.Read(); // [
bool parsing = true;
while (parsing)
{
TOKEN nextToken = NextToken; switch (nextToken)
{
case TOKEN.NONE:
return null;
case TOKEN.COMMA:
continue;
case TOKEN.SQUARED_CLOSE:
parsing = false;
break;
default:
object value = ParseByToken(nextToken); array.Add(value);
break;
}
} return array;
} object ParseValue()
{
TOKEN nextToken = NextToken;
return ParseByToken(nextToken);
} object ParseByToken(TOKEN token)
{
switch (token)
{
case TOKEN.STRING:
return ParseString();
case TOKEN.NUMBER:
return ParseNumber();
case TOKEN.CURLY_OPEN:
return ParseObject();
case TOKEN.SQUARED_OPEN:
return ParseArray();
case TOKEN.TRUE:
return true;
case TOKEN.FALSE:
return false;
case TOKEN.NULL:
return null;
default:
return null;
}
} string ParseString()
{
StringBuilder s = new StringBuilder();
char c; // ditch opening quote
json.Read(); bool parsing = true;
while (parsing)
{ if (json.Peek() == -)
{
parsing = false;
break;
} c = NextChar;
switch (c)
{
case '"':
parsing = false;
break;
case '\\':
if (json.Peek() == -)
{
parsing = false;
break;
} c = NextChar;
switch (c)
{
case '"':
case '\\':
case '/':
s.Append(c);
break;
case 'b':
s.Append('\b');
break;
case 'f':
s.Append('\f');
break;
case 'n':
s.Append('\n');
break;
case 'r':
s.Append('\r');
break;
case 't':
s.Append('\t');
break;
case 'u':
var hex = new char[]; for (int i = ; i < ; i++)
{
hex[i] = NextChar;
} s.Append((char)Convert.ToInt32(new string(hex), ));
break;
}
break;
default:
s.Append(c);
break;
}
} return s.ToString();
} object ParseNumber()
{
string number = NextWord;
// 摘要:
// 报告指定 Unicode 字符在此字符串中的第一个匹配项的索引。
//
// 参数:
// value:
// 要查找的 Unicode 字符。
//
// 返回结果:
// 如果找到该字符,则为 value 的从零开始的索引位置;如果未找到,则为 -1。
if (number.IndexOf('.') == -)
{
long parsedInt;
// 将数字的字符串表示形式转换为它的等效 64 位有符号整数。一个指示转换是否成功的返回值。
Int64.TryParse(number, out parsedInt);
return parsedInt;
} double parsedDouble;
Double.TryParse(number, out parsedDouble);
return parsedDouble;
}
//
void EatWhitespace()
{
//指示指定字符串中位于指定位置处的字符是否属于空白类别。
while (Char.IsWhiteSpace(PeekChar))
{
json.Read();
//摘要:
// 返回下一个可用的字符,但不使用它。
//
// 返回结果:
// 表示下一个要读取的字符的整数,或者,如果没有更多的可用字符或该流不支持查找,则为 -1。
if (json.Peek() == -)
{
break;
}
}
} char PeekChar
{
get
{
// 读取输入字符串中的下一个字符并将该字符的位置提升一个字符。
//
// 返回结果:
// 基础字符串中的下一个字符,或者如果没有更多的可用字符,则为 -1。
return Convert.ToChar(json.Peek());
}
} char NextChar
{
get
{
return Convert.ToChar(json.Read());
}
} string NextWord
{
get
{
// 表示可变字符字符串。无法继承此类。
StringBuilder word = new StringBuilder(); while (!IsWordBreak(PeekChar))
{
// 摘要:
// 在此实例的结尾追加指定 Unicode 字符的字符串表示形式。
//
// 参数:
// value:
// 要追加的 Unicode 字符。
//
// 返回结果:
// 完成追加操作后对此实例的引用。
word.Append(NextChar);
//下一个字符为空
if (json.Peek() == -)
{
break;
}
}
//
return word.ToString();
}
} TOKEN NextToken
{
get
{
EatWhitespace(); if (json.Peek() == -)
{
return TOKEN.NONE;
} switch (PeekChar)
{
case '{':
return TOKEN.CURLY_OPEN;
case '}':
json.Read();
return TOKEN.CURLY_CLOSE;
case '[':
return TOKEN.SQUARED_OPEN;
case ']':
json.Read();
return TOKEN.SQUARED_CLOSE;
case ',':
json.Read();
return TOKEN.COMMA;
case '"':
return TOKEN.STRING;
case ':':
return TOKEN.COLON;
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '-':
return TOKEN.NUMBER;
} switch (NextWord)
{
case "false":
return TOKEN.FALSE;
case "true":
return TOKEN.TRUE;
case "null":
return TOKEN.NULL;
} return TOKEN.NONE;
}
}
} /// <summary>
/// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string
/// </summary>
/// <param name="json">A Dictionary<string, object> / List<object></param>
/// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns>
public static string Serialize(object obj)
{
return Serializer.Serialize(obj);
} sealed class Serializer
{
StringBuilder builder; Serializer()
{
//创建生成器
builder = new StringBuilder();
}
//序列化
public static string Serialize(object obj)
{
var instance = new Serializer(); instance.SerializeValue(obj); return instance.builder.ToString();
}
//类型
void SerializeValue(object value)
{
IList asList;
IDictionary asDict;
string asStr; if (value == null)
{
builder.Append("null");
}
else if ((asStr = value as string) != null)
{
SerializeString(asStr);
}
else if (value is bool)
{
builder.Append((bool)value ? "true" : "false");
}
else if ((asList = value as IList) != null)
{
SerializeArray(asList);
}
else if ((asDict = value as IDictionary) != null)
{
SerializeObject(asDict);
}
else if (value is char)
{
SerializeString(new string((char)value, ));
}
else
{
SerializeOther(value);
}
}
//序列化对象
void SerializeObject(IDictionary obj)
{
bool first = true; builder.Append('{'); foreach (object e in obj.Keys)
{
if (!first)
{
builder.Append(',');
} SerializeString(e.ToString());
builder.Append(':'); SerializeValue(obj[e]); first = false;
} builder.Append('}');
}
// 序列化数组
void SerializeArray(IList anArray)
{
builder.Append('['); bool first = true; foreach (object obj in anArray)
{
if (!first)
{
builder.Append(',');
} SerializeValue(obj); first = false;
} builder.Append(']');
}
//string
void SerializeString(string str)
{
builder.Append('\"'); char[] charArray = str.ToCharArray();
foreach (var c in charArray)
{
switch (c)
{
case '"':
builder.Append("\\\"");
break;
case '\\':
builder.Append("\\\\");
break;
case '\b':
builder.Append("\\b");
break;
case '\f':
builder.Append("\\f");
break;
case '\n':
builder.Append("\\n");
break;
case '\r':
builder.Append("\\r");
break;
case '\t':
builder.Append("\\t");
break;
default:
int codepoint = Convert.ToInt32(c);
if ((codepoint >= ) && (codepoint <= ))
{
builder.Append(c);
}
else
{
//builder.Append("\\u");
//builder.Append(codepoint.ToString("x4"));
builder.Append(c);
}
break;
}
} builder.Append('\"');
}
//其他
void SerializeOther(object value)
{
// NOTE: decimals lose precision during serialization.
// They always have, I'm just letting you know.
// Previously floats and doubles lost precision too.
//注意:小数在序列化过程中丢失精度。
//他们总是有,我只是让你知道。
//以前失去精度和双精度浮点数。
if (value is float)
{
builder.Append(((float)value).ToString("R"));
}
else if (value is int
|| value is uint
|| value is long
|| value is sbyte
|| value is byte
|| value is short
|| value is ushort
|| value is ulong)
{
builder.Append(value);
}
else if (value is double
|| value is decimal)
{
builder.Append(Convert.ToDouble(value).ToString("R"));
}
else
{
SerializeString(value.ToString());
}
}
}
}
}

三.SQL服务器CLR配置(允许SQL调用.net程序)

    sp_configure 'show advanced options', 1;
RECONFIGURE WITH override
GO
sp_configure 'clr enabled', 1;
RECONFIGURE WITH override
GO
Sp_changedbowner 'sa',true --sa改为当前登入用户名
alter database [dbname] set trustworthy on --bbname 改为自己的库名

四.注册 CLR 程序集

   create  ASSEMBLY SQLfunctionAssembly
FROM 'D:\SQLClr.dll' --改为自己C#写的dll路径填写
WITH PERMISSION_SET = UNSAFE;

创建的.net程序集数据会写入下表:

  select * from sys.assemblies
select * from sys.assembly_files

五.创建存储过程

   CREATE PROCEDURE[dbo].[Json2Table] (
@jsonString NVARCHAR(max),
@isVerticalTable bit
)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SQLfunctionAssembly].[SQLClr.SQLfunction].[Json2Table] --[SQL程序集名].[命名空间.类名].[方法名]

六.测试Json转DataTable存储过程

DECLARE @jsonString VARCHAR(MAX)
SET @jsonString = '
[{"TechName":"ECN","TechNo":"EC_01","id":"1"},{"TechName":"流程指示","TechNo":"PI_01","id":"2"},{"TechName":"计划投料","TechNo":"FP_01","id":"3"},{"TechName":"开料","TechNo":"CC_01","id":"4"},{"TechName":"裁切","TechNo":"CC_02","id":"5"},{"TechName":"磨边","TechNo":"CC_03","id":"6"},{"TechName":"圆角","TechNo":"CC_04","id":"7"},{"TechName":"打标","TechNo":"CC_05","id":"8"},{"TechName":"烘板","TechNo":"CC_06","id":"9"},{"TechName":"钻孔","TechNo":"MD_02","id":"10"},{"TechName":"去毛刺","TechNo":"PT_01","id":"11"},{"TechName":"烘板","TechNo":"PT_05","id":"12"},{"TechName":"等离子处理","TechNo":"PT_02","id":"13"},{"TechName":"沉铜","TechNo":"PT_07","id":"14"},{"TechName":"负片电镀","TechNo":"PP_02","id":"15"},{"TechName":"磨板","TechNo":"PP_05","id":"16"},{"TechName":"外层前处理","TechNo":"OL_01","id":"17"},{"TechName":"贴膜","TechNo":"OL_03","id":"18"},{"TechName":"曝光","TechNo":"OL_04","id":"19"},{"TechName":"显影","TechNo":"OL_05","id":"20"},{"TechName":"酸性蚀刻","TechNo":"OL_06","id":"21"},{"TechName":"退膜","TechNo":"OL_07","id":"22"},{"TechName":"外层AOI","TechNo":"AO_04","id":"23"},{"TechName":"烘板","TechNo":"SM_02","id":"24"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"25"},{"TechName":"丝印","TechNo":"SM_05","id":"26"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"27"},{"TechName":"丝印","TechNo":"SM_05","id":"28"},{"TechName":"预烘","TechNo":"SM_06","id":"29"},{"TechName":"曝光","TechNo":"SM_09","id":"30"},{"TechName":"显影","TechNo":"SM_10","id":"31"},{"TechName":"终固化","TechNo":"SM_11","id":"32"},{"TechName":"喷砂","TechNo":"EN_01","id":"33"},{"TechName":"板边包胶","TechNo":"EN_02","id":"34"},{"TechName":"沉金","TechNo":"EN_04","id":"35"},{"TechName":"水洗烘干","TechNo":"EN_06","id":"36"},{"TechName":"铣板","TechNo":"FO_02","id":"37"},{"TechName":"成品清洗","TechNo":"FO_14","id":"38"},{"TechName":"小板切割","TechNo":"FO_08","id":"39"},{"TechName":"功能检查","TechNo":"FI_01","id":"40"},{"TechName":"外观检查","TechNo":"FI_02","id":"41"},{"TechName":"内包装","TechNo":"PK_01","id":"42"},{"TechName":"入库","TechNo":"DE_01","id":"43"},{"TechName":"外包装","TechNo":"DE_02","id":"44"},{"TechName":"出库","TechNo":"DE_03","id":"45"}] '
exec dbo.Json2Table @jsonString,0 --0转横表 1转竖表

运行后结果(转横表)

运行后结果(转竖表)

PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法的更多相关文章

  1. PCB MS SQL 标量函数(CLR) 实现DataTable转Json方法

    一.准备需转为json字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的JSON字符串的效果 [{"TechName":"开料",& ...

  2. PCB MS SQL 排序应用---SQL相邻数据区间值求解

    其中一篇 博文中有写<PCB MS SQL 排序应用---相邻数据且相同合并处理>此篇有也应相用也同的技巧,实现相邻数据区间值求解 示例: 原数据:处理前 求出区间值:处理后 SQL 代码 ...

  3. PCB MS SQL 标量函数(CLR) 实现Socket发送消息

    在PCB业务系统中,数据库中的数据总是被应用端主动连接数据库并操作数据,是否想过可以让数据库主动的将数据推送出去呢! 答应其实是可以的.比如有这样的应用场景! 当SQL SERVER数据库满足某个条件 ...

  4. PCB MS SQL 标量函数与表值函数(CLR) 实现文件与目录操作

    一.C#写SQL SERVER(CLR)实现文件操作 标量函数: 文件移动 ,复制,检测文件存在,写入新文件文本,读取文本,创建目录,删除目录,检测目录是否存在 /// <summary> ...

  5. PCB MS SQL 标量函数(CLR) 实现DataTable转HTML的方法

    一.准备需转为HMLT字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的HTML的文本 <html ><head></head>< ...

  6. json转datatable(正则表达式的方法)

    /// <summary> /// 将json转换为DataTable /// </summary> /// <param name="strJson" ...

  7. PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明

    用CLR写函数:标量函数,表值函数 很好理解,如果用聚合函数则不是那么好理解了, 这里将CLR函数说明一下,其实关键是对聚合函数说明 用CLR写聚合函数关键点,是要理解CLR与SQL是如何进行数据交互 ...

  8. PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)

    将字符串分割为表表经常用到,这里 SQL表值函数与CLR  表值函数,两种实现方法例出来如下: SELECT * FROM FP_EMSDB_PUB.dbo.SqlSplit('/','1oz/1.5 ...

  9. PCB MS SQL SERVER版本管控工具source_safe_for_sql_server

    PCB由于业务关系复杂,业务触发一个事件时,可能需与数据库多个表进行关连处理才能拿到数据结果, 而表关连并不是简单的关连,实际是要进行大量数据筛选,逻辑判断,转换等过程...这个过程是复杂的 想一想, ...

随机推荐

  1. 【INSERT】逐行提交、批量提交及极限提速方法

    在Oracle数据库中,不是提交越频繁越好.恰恰相反,批量提交可以得到更好的性能.这篇文章给大家简单展示一下在Oracle数据库中逐行提交于批量提交两者之间的性能差别.最后再给出一种可以极大改变性能的 ...

  2. 常用Linux命令_20190211

    1.创建文件夹:mkdir 文件夹名称 2.查看IP地址信息:ipconfig -a 3.查看内存使用情况:free -m 4.查看CPU使用情况:top 5.查看磁盘使用情况:df -a/-h 6. ...

  3. CentOS \Linux文件权限详解

    文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限:只允许用户自己访问:允许一个 ...

  4. JDBC插入数据时中文变为问号的解决方法

    JDBC插入数据时中文变为问号的解决方法 制作人:全心全意 出现中文变问号的代码: String url = "jdbc:mysql://localhost:3306/test"; ...

  5. Servlet过滤器的使用

    Servlet过滤器的使用 制作人:全心全意 Servlet过滤器:Servlet过滤器与Servlet十分相似,但它具有拦截客户端请求的功能,Servlet过滤器可以改变请求中的内容,来满足实际开发 ...

  6. 将登录代码模块化,然后用add address接口来调用它,success!

    登录模块,单独写成mylogin()方法,保存为modeltry119.py,然后接口的文件只写接口, 在post请求时,引用mylogin()返回的cookies就好了. requests.post ...

  7. IDEA下tomcat中web项目乱码,控制台乱码解决指南

    若是由于过滤器,request ,response等原因,不适用. 原文作者:http://www.kafeitu.me/tools/2013/03/26/intellij-deal-chinese- ...

  8. Python学习笔记 (2.2)Python中的字符编码问题及标准数据类型之String(字符串)

    Python3中的String类型 首先,Python中没有字符类型,只有字符串类型.单个字符按照长度为1的字符串处理,这对于曾是OIER的我来说有点不适应啊. 字符串的表示方法 最常用的就是用一对双 ...

  9. 生产(production)

    [题目描述] 工厂为了生产一种复杂的产品,给各个生产部门制定了详细的生产计划.那么,就经常会有生产部门要把产品送到另一个生产部门作为原料.这是一个注重产品质量的工厂,所以每当有产品要从A部门运到B部门 ...

  10. 1154 能量项链 2006年NOIP全国联赛提高组 codevs

    1154 能量项链  2006年NOIP全国联赛提高组 codevs 题目描述 Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头 ...