【问题标题】:Replace double quotes in json string with empty string用空字符串替换json字符串中的双引号
【发布时间】:2011-01-13 13:51:16
【问题描述】:

我对 json 字符串的反序列化有问题,因为字符串格式不正确。

例如 json 对象由字符串属性 statusMessage 组成,值为 "Hello "dog" "。

正确的格式应该是“Hello \”dog \“”。

我想从此属性中删除双引号。

像这样的东西。 “你好”狗“”。 -> “你好狗”。

这是我工作的原始 json 字符串。

"{\"jancl\":{\"idUser\":18438201,\"nick\":\"JANCl\",\"photo\":\"1\",\"sex\":1,\"photoAlbums\":1,\"videoAlbums\":0,\"sefNick\":\"jancl\",\"profilPercent\":75,\"emphasis\":false,\"age\":\"-\",\"isBlocked\":false,\"PHOTO\":{\"normal\":\"http://u.aimg.sk/fotky/1843/82/n_18438201.jpg?v=1\",\"medium\":\"http://u.aimg.sk/fotky/1843/82/m_18438201.jpg?v=1\",\"24x24\":\"http://u.aimg.sk/fotky/1843/82/s_18438201.jpg?v=1\"},\"PLUS\":{\"active\":false,\"activeTo\":\"0000-00-00\"},\"LOCATION\":{\"idRegion\":\"6\",\"regionName\":\"Trenčiansky kraj\",\"idCity\":\"138\",\"cityName\":\"Trenčianske Teplice\"},\"STATUS\":{\"isLoged\":true,\"isChating\":false,\"idChat\":0,\"roomName\":\"\",\"lastLogin\":1294925369},\"PROJECT_STATUS\":{\"photoAlbums\":1,\"photoAlbumsFavs\":0,\"videoAlbums\":0,\"videoAlbumsFavs\":0,\"videoAlbumsExts\":0,\"blogPosts\":0,\"emailNew\":0,\"postaNew\":0,\"clubInvitations\":0,\"dashboardItems\":1},\"STATUS_MESSAGE\":{\"statusMessage\":\"\"Status\"\",\"addTime\":\"1294872330\"},\"isFriend\":false,\"isIamFriend\":false}}"

问题来了,json字符串由这个对象组成:

"STATUS_MESSAGE": {"statusMessage":" "some "bad" value"   ", "addTime" :"1294872330"}

我要修改的字符串条件:

  • 字符串以 "statusMessage":" 开头
  • 字符串可以有任何 *长度从 0 -N *
  • 字符串以 "、"addTime 结尾

所以我尝试为以“statusMessage”开头的字符串编写模式:”,长度不限,以“,”addTime结尾。

这里是:

 const string pattern = "  \" statusMessage \" : \"  .*?  \",\"addTime\"  ";

 var regex = new Regex(pattern, RegexOptions.IgnoreCase);

//here i would replace " with empty string
 string result = regex.Replace(jsonString, match => ???);

但我认为模式是错误的,我也不知道如何用空字符串替换双引号(删除双引号)。

我的目标是:

"statusMessage":" "some "bad" value"

"statusMessage":" "some bad value"

感谢建议

【问题讨论】:

  • 我认为绝对没有机会修复数据源本身?我通常会发现,当机器生成的字符串显示为错误格式时,我不相信来源不会弄乱我没见过的东西。对于 XML 来说尤其如此 - 服务于格式错误的 XML 的数据源通常不会采用使用 XML API 的理智方法,这让我想知道它们在哪里还缺乏理智。我会以同样的方式查看 JSON。
  • 如果字符串可以包含冒号和逗号(:,),这很可能,我认为问题无法解决 - 您可能会错过整个键和值,或者创建多余的。
  • @Jon Skeet:我没有机会在服务器上纠正 json 格式,我认为使用 regExp 只是一种解决方案。因为我需要将此 json 反序列化为 CLR 对象,所以首先必须是正确格式的 json 字符串。我对正则表达式、json 范围不友好。如果你能帮助我,我会很高兴。
  • @Kobi。我想听到不可能的解决方案;)
  • 这是一个示例:这是一个合法的 JSON 属性,只有一个键:key:"val1\",notkey:\"val2\",dummy:"。你看key:"val1",notkey:"val2",dummy:" - 你怎么知道它是一个单一的值? (我也许能找到一个更简单的例子,但你明白了)

标签: c# regex string json replace


【解决方案1】:

为了在客户端序列化 json,我使用这样的东西:

    var JSON = JSON || {};  

    JSON.stringify = JSON.stringify || function (obj) {
        var t = typeof (obj);
        if (t != "object" || obj === null) {
            // simple data type  
            if (t == "string") obj = '"' + obj + '"';
            return String(obj);
        }
        else {
            // recurse array or object  
            var n, v, json = [], arr = (obj && obj.constructor == Array);
            for (n in obj) {
                v = obj[n]; t = typeof (v);
                if (t == "string") v = '"' + v + '"';
                else if (t == "object" && v !== null) v = JSON.stringify(v);
                json.push((arr ? "" : '"' + n + '":') + String(v));
            }
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
        }
    };

然后

$.ajax({
    ...
    data: JSON.stringify({
        someThing1: [
            { Id: '001', FooValue: ''},
            { Id: '002', FooValue: ''}
        ],
        someThing2: [
            { Id: '001', FooValue: ''},
            { Id: '002', FooValue: ''}
        ]
    }),
    ...
});

在服务器端我使用 Newton.Json (http://james.newtonking.com/pages/json-net.aspx)

object deserializeObject = JsonConvert.DeserializeObject(requestParameterTextRepresentation, RootType);

如果您无法修改客户端脚本以传递正确的 json 字符串,那么您所有的正则表达式都是徒劳的。

【讨论】:

    【解决方案2】:

    应该这样做:

    var str = '"STATUS_MESSAGE": {"statusMessage":" "some "bad" value"   ", "addTime" :"1294872330"}"';
    str = str.replace(/("statusMessage"\s*:\s*")(.+?)("\s*,\s*"addTime)/, function(m0,m1,m2,m3) { return m1 + m2.replace(/"/g,'') + m3; });
    
    //now str == "STATUS_MESSAGE": {"statusMessage":" some bad value   ", "addTime" :"1294872330"}"
    

    编辑:对不起,我不知道为什么我把它和一个 javascript 问题混淆了:s - 你可以在 c# 中做一个非常相似的方法,但我现在无法想出语法。

    【讨论】:

      【解决方案3】:

      虽然它是一个极其弱小的、hacky 的解决方案,但它应该适用于简单的情况:

      string pattern = @"(?<=""statusMessage"":"").*?(?="",""addTime"")";
      string result = Regex.Replace(malformedJSON, pattern,
                                    match => match.Value.Replace("\"", ""));
      

      我正在使用环视查找字符串,然后从中删除所有引号。您也可以通过替换为"\\\"" 来逃避它们。

      【讨论】:

      • @user572844 - 所以,如果我想问一下 - 你是如何最终得到 JavaScript 解决方案的?
      • 嗨,kobi,我省略了 js 解决方案。因为我有 Web 服务调用另一个服务并获得无效的 json,所以在这个服务上我修复这个 json 字符串添加新数据和这个正确的 json 我在 ajax req 上发送。感谢您的提问和帮助。我的解决方案是临时解决方案,但现在我遇到了另一个优先级更高的问题。抱歉,我稍后再回答,我还有很多工作要做。
      【解决方案4】:

      试试这个(虽然不是一个完美的解决方案):

                  string data = "\"STATUS_MESSAGE\": {\"statusMessage\":\" \"some \"bad\" value\"   \", \"addTime\" :\"1294872330\"}";
      
              Regex rxStatusMessage = new Regex("\\s*\"statusMessage\"\\s*:\"\\s*");
              Regex rxAddTime = new Regex("\",\\s*\"addTime\"\\s*:");
      
              data = rxStatusMessage.Replace(data, "\x02");
              data = rxAddTime.Replace(data, "\x03");
      
              Regex rxReplace = new Regex("\x02.*\x03");
      
              data = rxReplace.Replace(data, m => m.Value.Replace("\"", ""));
      
              data = data.Replace("\x02", "\"statusMessage\":\"");
              data = data.Replace("\x03", "\", \"addTime\" :");
      

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 2023-03-23
        • 1970-01-01
        • 2015-08-25
        • 2017-08-21
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多