user572844
user572844

Reputation:

Replace double quotes in json string with empty string

I have problem with deserialization of json string, because string is bad format.

For example json object consist string property statusMessage with value "Hello "dog" ".

The correct format should be "Hello \" dog \" " .

I would like remove double quotes from this property.

Something Like this. "Hello "dog" ". -> "Hello dog ".

Here is it original json string which I work.

"{\"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}}"

Problem is here, json string consist this object:

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

Condition of string which I want modified:

So I try write pattern for string which start with "statusMessage":", has any lenght and is ended with ", "addTime.

Here is it:

 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 => ???);

But I think pattern is wrong, also I don’t know how replace double quotes with empty string (remove double quotes).

My goal is :

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

to "statusMessage":" "some bad value"

Thank for advice

Upvotes: 3

Views: 10062

Answers (4)

CSharpenter
CSharpenter

Reputation: 762

Try This (Not a perfect solution though):

            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\" :");

Upvotes: 1

Martin Jespersen
Martin Jespersen

Reputation: 26183

This should do it:

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

Edit: sorry i don't know why i confused this with a javascript question :s - You are able to do a very similar approach in c# tho i can't come up with the syntax right now.

Upvotes: 1

Kobi
Kobi

Reputation: 138007

While it is an extremely weak, hacky, solution, this should work in simple cases:

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

I'm using lookarounds to find the string, and then remove all quotes from it. You may also escape them by replacing with "\\\"".

Upvotes: 1

Dao
Dao

Reputation: 2824

To serialize json on client side I use something like this:

    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 ? "]" : "}");
        }
    };

then

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

On server-side I use Newton.Json ( http://james.newtonking.com/pages/json-net.aspx )

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

If you have no ability to modify client-side script to pass correct json-string, then all your regexps are vain effort.

Upvotes: 2

Related Questions