I pull json data from a server. It contains a dictionary with text that I insert into a html template.
How do I properly escape this string?
NSString* json = /* can be anything, but also garbage */
NSString* json_escaped = [json someEscapeMethod]; /////// HOW TO ESCAPE THIS ?
NSString* script = [NSString stringWithFormat:#"process('%#')", json_escaped];
NSString* result = [self.webView stringByEvaluatingJavaScriptFromString:script];
I currently do like this, but I'm not sure wether the escaping is sufficiently
NSString* json_escaped = [json stringByReplacingOccurrencesOfString:#"'" withString:#"\\'"];
I now encode it this way, but the overhead is huge.
NSString* json = /* can be anything, but also garbage */
NSString* json_escaped = [json stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString* script = [NSString stringWithFormat:#"process('%#')", json_escaped];
NSString* result = [self.webView stringByEvaluatingJavaScriptFromString:script];
And decode it in javascript like this
function process(json_escaped) {
var json = decodeURIComponent(json_escaped);
alert('json: ' + json.toString());
}
I'm still looking for a better solution with less overhead.
Update
I have recently learned that there exists several frameworks for bridging objective-c with javascript.
The "Escaping Characters in a String" section of NSRegularExpression may work.
Related
The HTML data contains multiple lines with different anchor tags. The body on JSON like below format:
"description": "<div><b>Hiiiiiii,</b> officially known as <b>Hiiiiiii,</b>
Well you need this method to strip down the HTML tags from the string.
First you get the whole string in a variable like NSSting *wholeHtml = [jsonDictionary objectForKey:#"description"];.
-(NSString *) stringByStrippingHTML:(NSString *)inputString {
NSRange r;
NSString *toReturn;
while ((r = [inputString rangeOfString:#"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
toReturn = [inputString stringByReplacingCharactersInRange:r withString:#""];
return toReturn;
}
Then you call this method like this : NSString *outputString = [self stringByStrippingHTML:wholeHtml]; and you will get the required string in the variable outputString. You can also create a catagory of NSString and that would make your work more easy.
1 Take a string and store JSON key's description value in it .
eg: NSString str=[JSON value for key :#"description"];
2 Now Take a WebView and give this string to it .
eg:UIWebView webView = [[UIWebView alloc] init];
[webView loadHTMLString:str baseURL:nil];
I created a small app which will get html from website and turn that into string. Now I want to delete some text from that string but it is not deleting that text. Here is my code that I wrote.
-(void)dk {
NSString *myURLString = #"http://bountyboulevardss.eq.edu.au/?cat=3&feed=rss2";
NSURL *myURL = [NSURL URLWithString:myURLString];
NSError *error = nil;
NSString *myHTMLString = [NSString stringWithContentsOfURL:myURL encoding: NSUTF8StringEncoding error:&error];
[myHTMLString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if (error != nil)
{
NSLog(#"Error : %#", error);
}
else
{
}
[myHTMLString stringByReplacingOccurrencesOfString:#"<title>Bounty Boulevard » » Latest News</title>" withString:#""];
NSString *newString = myHTMLString;
NSScanner *scanner = [NSScanner scannerWithString:newString];
NSString *token = nil;
[scanner scanUpToString:#"<title>" intoString:NULL];
[scanner scanUpToString:#"</title>" intoString:&token];
headline.text = token;
NSLog(#"%#", myHTMLString);
}
Like you see in the beginning I try to delete the first title in the text and then I scan for the title I still keep getting the title I deleted. I checked in log and it is not deleting. I don't know what I am doing wrong. Sorry guys if this is really easy. Thanks for helping.
Not an Objective-C expert myself, but I guess you need to assign the replaced value back to the variable:
myHTMLString = [myHTMLString stringByReplacingOccurrencesOfString:#"<title>Bounty Boulevard » » Latest News</title>" withString:#""];
So, in general the idiomatic way to replace a string and keeping the result in the same variable is:
str = [str stringByReplacingOccurrencesOfString....];
This is confirmed by the stringByReplacingOccurencesOfString doc which states that this method "returns a new string in which all occurrences of a target string in the receiver are replaced by another given string.".
I am getting data from the Yummly API and I would like to use it as though it were serialized JSON data. However, it is currently a string, and I cannot figure out how to turn it to data correctly. The code is as following:
NSString *searchParameters = #"basil"; //should be from text box
//NSError *error1 = nil;
NSString *searchURLName = [#"http://api.yummly.com/v1/api/recipes?_app_id=myAPIId&_app_key=myAPIkey&" stringByAppendingString:searchParameters];
NSURL *searchURL = [NSURL URLWithString:searchURLName];
NSString *searchResults = [NSString stringWithContentsOfURL:searchURL encoding:NSUTF8StringEncoding error:nil];
// Here, the search results are formatted just like a normal JSON file,
// For example:
/* [
"totalMatchCount":777306,
"facetCounts":{}
]
*/
// however it is a string, so I tried to convert it to data
NSData *URLData = [searchResults dataUsingEncoding:NSUTF8StringEncoding];
URLData = [URLData subdataWithRange:NSMakeRange(0, [URLData length] - 1)];
_searchArray = [NSJSONSerialization JSONObjectWithData:URLData options:NSJSONReadingMutableContainers error:nil];
Somewhere over the last four lines, it didn't do what it was supposed to and there is no data in the data object. Any advice or quick hints in the right direction are much appreciated! Thank you1
Look at the error being returned from the NSJSONSerialization object like
NSError *error;
_searchArray = [NSJSONSerialization JSONObjectWithData:URLData options:NSJSONReadingMutableContainers error:&error];
NSLog(#"%#", error);
This might give you a hint of what's wrong. This should work though.
And why exactly are you doing URLData = [URLData subdataWithRange:NSMakeRange(0, [URLData length] - 1)];? You don't need to copy the data, if that's why you're doing that.
Plus, it seems like you're assuming to get an array as the top level object (judging by
/* [
"totalMatchCount":777306,
"facetCounts":{}
]
*/
but this is a dictionary. Basically you probably want a dictionary, not array. This it should be
/* {
"totalMatchCount":777306,
"facetCounts":{}
}
*/
But the error getting returned will tell you that.
It looks like you're over-complicating things a bit. You do not need to bring in this data as an NSString at all. Instead, just bring it in as NSData and hand that to the parser.
Try:
NSString *searchParameters = #"basil"; //should be from text box
NSString *searchURLName = [#"http://api.yummly.com/v1/api/recipes?_app_id=myAPIId&_app_key=myAPIkey&" stringByAppendingString:searchParameters];
NSURL *searchURL = [NSURL URLWithString:searchURLName];
NSData *URLData = [NSData dataWithContentsOfURL:searchURL];
_searchArray = [NSJSONSerialization JSONObjectWithData:URLData options:NSJSONReadingMutableContainers error:nil];
Note that you'll want to verify that the parsed JSON object is indeed an array as expected, and is not/does not contain [NSNull null].
I have a simple IOS application that I created for consultants where I work. It has a custom keyboard with notation that they use that includes superscript and subscript characters. The easiest way that I found to handle those characters was using HTML and a WebView, which works just fine.
I am now attempting to send this information to a web application that will insert it into a SQL database. Sending all of the other information works just fine, until I get to the transcript with HTML in it. I am encoding each of the values that I send through the query string with stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding but the query string fails when HTML elements are included. I believe this is due to the / that is not removed during the escape encoding. For example the HTML break tag becomes %3Cbr%20/%3E. So the < > and space are replaced, but not the /.
Should I be using a different method? Is there an easy way to send HTML over Query String? Am I correct that the / character is what is breaking my query string?
Here is the code I have now:
NSString *datePE =[dateString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *studentPE =[student stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *teacherPE =[teacher stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *transcriberPE =[transcriber stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *vrPE =[vrTextField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *totalTimePE =[totalTimeString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *transcriptPE =[transcriptString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
parameters = [NSString stringWithFormat:#"dateQS=%#&studentQS=%#&teacherQS=%#&transcriberQS=%#&vrQS=%#&totalTimeQS=%#&transcriptQS=%#",datePE ,studentPE,teacherPE,transcriberPE,vrPE,totalTimePE, transcriptPE];
request = [NSMutableURLRequest
requestWithURL:[NSURL URLWithString:#"http://server.domain.net/folder/subfolder/Default.aspx?"]];
[request setHTTPMethod:#"POST"];
[request setHTTPBody:[parameters dataUsingEncoding:NSUTF8StringEncoding]];
connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:YES];
Slowly but surely I think I'm going mad. After getting the solution to my problem and the app now also accepting spaces, it still won't add the data that contains spaces to my mysql database. Here is the code:
NSString *strURL = [NSString stringWithFormat:#"http://www.bbc.com/phpFile.php?number=%#&name=%#&lastname=%#", number, firstName, lastName];
NSString *webStringURl = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSLog(#"%#", strResult);
NSLog(#"%#", webStringURl);
NSLog even tells me that it does exactly what I tell him to:
ProjectX[4003:15203] http://www.bbc.com/phpFile.php?number=11166&name=Yong%20Wang%20Ding&lastname=Blamblam
It works everytime when the variables do not contain spaces. When I open the php file in my browser and enter the variables by hand (with spaces) it adds them to my database. I have no clue why it refuses to work when doing exactly(?) the same thing with my app.
It doesn't look like you're using webStringURl (sic) anywhere other than in the final NSLog statement. Are you sure you didn't mean to write:
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:webStringURl];
...for the third line?
At the moment, you're calling dataWithContentsOfURL on your unescaped version of the URL (which may still contain spaces).