Замените двойные кавычки в строке json пустой строкой - PullRequest
3 голосов
/ 13 января 2011

У меня проблема с десериализацией строки json, поскольку строка имеет неправильный формат.

Например, объект json состоит из свойства свойства statusMessage со значением "Hello " dog "".

Правильный формат должен быть "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"

Спасибо за совет

Ответы [ 4 ]

2 голосов
/ 13 января 2011

Для сериализации 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-строки, тогда все ваши регулярные выражения будут тщетными усилиями.

1 голос
/ 13 января 2011

Попробуйте (хотя и не идеальное решение):

            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\" :");
1 голос
/ 13 января 2011

Это должно сделать это:

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 #, но я не могу сейчас придумать синтаксис.

1 голос
/ 13 января 2011

Хотя это чрезвычайно слабое, хакерское решение, оно должно работать в простых случаях:

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

Я использую обходные пути, чтобы найти строку, а затем удалить из нее все кавычки. Вы также можете избежать их, заменив на "\\\"".

...