求助这种伪json字符串处理

qzyf1992 2015-04-23 10:09:24

{name:计算数据大表名称,sheets:[{sheetName:不同时期,special:[准业务,磨合期,老业主,稳定期]},{sheetName:50分制}]}

需求是把这种伪json转化成真的json,因为数据处理人员写伪json写的比较方便
现在我想以最外层的逗号分隔取得 name:计算数据大表名称 和 sheets:[{sheetName:不同时期,special:[准业务,磨合期,老业主,稳定期]},{sheetName:50分制}]可能实现么? 没想到合适的正则
...全文
336 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zujinsheng 2015-04-24
  • 打赏
  • 举报
回复
那个写伪json的就不能通过 帮助类转化一下么, 非得去自己拼接字符串..
  • 打赏
  • 举报
回复
引用 11 楼 anselmoe 的回复:
引用 1 楼 starfd 的回复:
这个正则搞不定的……
发现你了,json不太懂。。。
腐女妹子你的干嘛……
Ansel-枫儿-Moe 2015-04-24
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
这个正则搞不定的……
发现你了,json不太懂。。。
江南小鱼 2015-04-24
  • 打赏
  • 举报
回复
引用 楼主 qzyf1992 的回复:

{name:计算数据大表名称,sheets:[{sheetName:不同时期,special:[准业务,磨合期,老业主,稳定期]},{sheetName:50分制}]}
需求是把这种伪json转化成真的json,因为数据处理人员写伪json写的比较方便 现在我想以最外层的逗号分隔取得 name:计算数据大表名称 和 sheets:[{sheetName:不同时期,special:[准业务,磨合期,老业主,稳定期]},{sheetName:50分制}]可能实现么? 没想到合适的正则
别伪json了,写真json才是解决办法的途径,转来转去的烦不烦,而且转的结果也未必不出错。
qzyf1992 2015-04-23
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
这个正则搞不定的……
好像搞定了递归 加balance判断 能不能帮我测试下代码 是否有问题是否适合所有的json。。

    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;
        }
    }
}


  • 打赏
  • 举报
回复
这个正则搞不定的……
Hello World, 2015-04-23
  • 打赏
  • 举报
回复
还是叫你们的数据处理员先处理好,不然遇到内容包含,:{}[]什么的又是很麻烦,他们转换一下简单的事
Hello World, 2015-04-23
  • 打赏
  • 举报
回复
        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, "\"}");

qzyf1992 2015-04-23
  • 打赏
  • 举报
回复
引用 6 楼 apollokk 的回复:
你家的数据处理人员太任性了

        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分制}]}
准业务后面的大括号后面会多一个引号
Hello World, 2015-04-23
  • 打赏
  • 举报
回复
你家的数据处理人员太任性了

        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, "\"}");
於黾 2015-04-23
  • 打赏
  • 举报
回复
我只能呵呵了 因为写伪json方便,就可以写伪json,而不管解析起来是不是麻烦? 写个真json能死啊
qzyf1992 2015-04-23
  • 打赏
  • 举报
回复
引用 3 楼 dwxqn1010 的回复:
。。。。。写这么复杂干嘛?看你最终要的是什么,如果要的是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;
       }
   }
这个伪json不是我在写是别人在写key和value是没有引号的,数据不是json,怎么用json类库操作? 现在就是想用json类库操作 所以才写方法把数据不是json的转成标准json格式的数据。
dwxqn1010 2015-04-23
  • 打赏
  • 举报
回复
。。。。。写这么复杂干嘛?看你最终要的是什么,如果要的是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;
       }
   }

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧