62,041
社区成员
发帖
与我相关
我的任务
分享
{name:计算数据大表名称,sheets:[{sheetName:不同时期,special:[准业务,磨合期,老业主,稳定期]},{sheetName:50分制}]}
这个正则搞不定的……
需求是把这种伪json转化成真的json,因为数据处理人员写伪json写的比较方便 现在我想以最外层的逗号分隔取得 name:计算数据大表名称 和 sheets:[{sheetName:不同时期,special:[准业务,磨合期,老业主,稳定期]},{sheetName:50分制}]可能实现么? 没想到合适的正则{name:计算数据大表名称,sheets:[{sheetName:不同时期,special:[准业务,磨合期,老业主,稳定期]},{sheetName:50分制}]}
这个正则搞不定的……
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using System.Text.RegularExpressions;
namespace TestJson
{
class Program
{
static void Main(string[] args)
{
string jsonStr = "{name:计算数据大表名称,sheet:[{sheetName:不同时期,special:[准业务,磨合期,老业主,稳定期]},{sheetName:50分制}]}";
string jsonStr2 = "{\"name\":\"计算数据大表名称\",sheets:[{\"sheetName\":\"不同时期\",\"special\":[\"准业务\",\"磨合期\",\"老业主\",\"稳定期\"]},{\"sheetName\":\"50分制\"}]}";
//jsonStr to jsonStr2
jsonStr = jsonStr.Replace(",", ",");
string res = ConvertJsonStr(jsonStr);
Console.WriteLine(res);
Console.Read();
}
static string ConvertJsonStr(string jsonStr)
{
string temp = jsonStr;
string[] tempStrs;
//如果是json数据个格式
if (jsonStr[0].ToString() == "{")
{
List<string> resList = new List<string>();
jsonStr = RemoveHeadEnd(jsonStr);
tempStrs = GetOuterList(jsonStr,',');
for (int i = 0; i < tempStrs.Length; i++)
{
string tempStr = tempStrs[i];
string[] strs = GetOuterList(tempStr, ':');
//将json的key加上引号
strs[0] = "\"" + strs[0] + "\"";
//递归处理json的value 因为json的value可能是json array或者普通字符串
strs[1] = ConvertJsonStr(strs[1]);
tempStr = string.Join(":", strs);
resList.Add(tempStr);
}
return "{" + string.Join(",", resList) + "}";
}
//处理是array的情况
else if (jsonStr[0].ToString() == "[")
{
List<string> resList = new List<string>();
jsonStr = RemoveHeadEnd(jsonStr);
tempStrs = GetOuterList(jsonStr,',');
for (int i = 0; i < tempStrs.Length; i++)
{
string tempStr = tempStrs[i];
//array的每一项都有可能是json array 普通值直接递归
tempStr = ConvertJsonStr(tempStr);
resList.Add(tempStr);
}
return "[" + string.Join(",", resList) + "]";
}
//处理是普通字符的情况
else
{
return "\"" + jsonStr + "\"";
}
}
static string RemoveHeadEnd(string str)
{
str = str.Remove(0, 1);
str = str.Remove(str.Length - 1, 1);
return str;
}
static string[] GetOuterList(string jsonStr,char fuhao)
{
int index = 0;
int lastIndex =0;
List<string> res = new List<string>();
while (true)
{
int finalIndex = jsonStr.IndexOf(fuhao, lastIndex);
//后面已经没有逗号了取到末尾
if (finalIndex<0)
{
finalIndex = jsonStr.Length;
}
string data = jsonStr.Substring(index, finalIndex - index);
if (IsBanlance(data))
{
res.Add(data);
index = finalIndex + 1;
}
if (finalIndex == jsonStr.Length)
{
break;
}
lastIndex = finalIndex + 1;
}
return res.ToArray();
}
//json规则只有逗号一个逗号左右2边的[{和]}是平衡的才是个外围json
static bool IsBanlance(string str)
{
int leftSmall = 0;
int leftBig = 0;
int rightSmall = 0;
int rightBig = 0;
for (int i = 0; i < str.Length; i++)
{
char ch = str[i];
switch (ch)
{
case '[': leftSmall++; break;
case ']': rightSmall++; break;
case '{': leftBig++; break;
case '}': rightBig++; break;
default:
break;
}
}
if (leftSmall == rightSmall && leftBig == rightBig)
{
return true;
}
return false;
}
}
}
Regex reg = new Regex(@"(?<![\]}]),");
x = reg.Replace(x, "\",");
reg = new Regex(@",(?![{\[])");
x = reg.Replace(x, ",\"");
reg = new Regex(@"\:(?!\[)");
x = reg.Replace(x,"\":\"");
reg = new Regex(@"\:(?=\[)");
x = reg.Replace(x, "\":");
reg=new Regex("\\[(?![{\\[\\\"])");
x = reg.Replace(x, "[\"");
reg=new Regex("\\{(?![{\\[\\\"])");
x = reg.Replace(x, "{\"");
reg=new Regex("(?<![}\\]\\\"])\\]");
x=reg.Replace(x,"\"]");
reg = new Regex("(?<![}\\]\\\"])\\}");
x = reg.Replace(x, "\"}");
你家的数据处理人员太任性了string x = "{name:计算数据大表名称,sheets:[{sheetName:不同时期,special:[准业务,磨合期,老业主,稳定期]},{sheetName:50分制}]}"; Regex reg = new Regex(@"(?!}),(?!{)"); x = reg.Replace(x, "\",\""); reg = new Regex(@"\:(?!\[)"); x = reg.Replace(x,"\":\""); reg = new Regex(@"\:(?=\[)"); x = reg.Replace(x, "\":"); reg=new Regex("\\[(?![{\\[\\\"])"); x = reg.Replace(x, "[\""); reg=new Regex("\\{(?![{\\[\\\"])"); x = reg.Replace(x, "{\""); reg=new Regex("(?<![}\\]\\\"])\\]"); x=reg.Replace(x,"\"]"); reg = new Regex("(?<![}\\]\\\"])\\}"); x = reg.Replace(x, "\"}");
{name:计算数据大表名称,sheet:[{sheetName:不同时期,special:[{name:准业务},磨合期,老业主,稳定期]},{sheetName:50分制}]}
准业务后面的大括号后面会多一个引号
string x = "{name:计算数据大表名称,sheets:[{sheetName:不同时期,special:[准业务,磨合期,老业主,稳定期]},{sheetName:50分制}]}";
Regex reg = new Regex(@"(?!}),(?!{)");
x = reg.Replace(x, "\",\"");
reg = new Regex(@"\:(?!\[)");
x = reg.Replace(x,"\":\"");
reg = new Regex(@"\:(?=\[)");
x = reg.Replace(x, "\":");
reg=new Regex("\\[(?![{\\[\\\"])");
x = reg.Replace(x, "[\"");
reg=new Regex("\\{(?![{\\[\\\"])");
x = reg.Replace(x, "{\"");
reg=new Regex("(?<![}\\]\\\"])\\]");
x=reg.Replace(x,"\"]");
reg = new Regex("(?<![}\\]\\\"])\\}");
x = reg.Replace(x, "\"}");
。。。。。写这么复杂干嘛?看你最终要的是什么,如果要的是value 那么首先写一个实体类(ModelClass)里面有name(string)与sheets(数组,也可以写成List<class>)属性 然后通过net4.0里面的System.Runtime.Serialization.Json,如果项目当中用的不是4.0,也可以下载一个第三方的json类库 这样你想怎么操作就可以了啊 以下是net4.0json工具类:using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Runtime.Serialization.Json; using System.IO; using System.Text; /// <summary> /// JSON序列化和反序列化辅助类 /// </summary> 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(); return jsonString; } /// <summary> /// JSON反序列化 /// </summary> public static T JsonDeserialize<T>(string jsonString) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); T obj = (T)ser.ReadObject(ms); return obj; } }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
/// <summary>
/// JSON序列化和反序列化辅助类
/// </summary>
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();
return jsonString;
}
/// <summary>
/// JSON反序列化
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}
}