Flutter parse unicode characters not working - android

I have the following string coming from my backend server \u25CF\u25CF\u25CF and when I decode it with UTF-8 it's working fine in the iOS native app, But when I try to parse it in flutter I'm not able to get the converted value. I have tried the following approaches but none worked
String converted = Utf8Decoder().convert(userName.codeUnits);
String uname = utf8.decode(userName.runes.toList());
String runes = String.fromCharCodes(Runes('$userName'));
Does anyone know how we can fix this? The real value should be 3 dots after conversion.
Update
This is json parsing code
if (response.statusCode == 200) {
Map<String, dynamic> postResponse = response.data;
var postsJson = postResponse["posts"];
for (var postObjet in postsJson) {
Map<String, dynamic> finalMap = Map<String, dynamic>.from(postObjet);
Post p = Post.fromMap(finalMap);
posts.add(p);
}
}
Sample JSON Response
The Chat service we\u2019ve been paying for since our launch

You are starting with a string with unicode escapes and you want to end up with a string containing the actual unicode characters. This is easy if the input contains only unicode escapes as you can simply strip out the \u and parse the hex to a code point.
final input = '\\u25CF\\u25CF\\u25CF'; // note I have to double the \ as this is source code
var hexPoints = input.split('\\u').sublist(1);
print(hexPoints); // [25CF, 25CF, 25CF]
// convert to a string from codepoints, parsing each hex string to an int
final result = String.fromCharCodes(
hexPoints.map<int>((e) => int.parse(e, radix: 16)).toList(),
);
print(result); // dot, dot, dot
The more general solution where there may be a mixture of escaped and unescaped characters is to use a regular expression that matches \xnnnn, parses the nnnn as hex and replaces it with that code point.
String sanitize(String s) => s.replaceAllMapped(
RegExp(r'\\u([0-9a-fA-F]{4})'),
(Match m) => String.fromCharCode(int.parse(m.group(1)!, radix: 16)),
);
Use it like this:
print(sanitize('ab\\u25CF\\u25CF\\u25CFcd')); //ab<dot><dot><dot>cd
Finally, note that if these escaped strings are appearing inside JSON, the JSON decoder will automatically convert them.

Consider using the characters package instead of runes. Seems like it can solve your problem.

Related

How to get this data in json fromat?

I got this data in PayUMoney and to show the user But problem how to get this data in json or key value pair format any one know that please help!!
addedon=2019-11-21+17%3A06%3A42&productinfo=FINE&firstname=Creataum+Test+User&
Assuming that u have got it as String following code will print the key value pair from the string
String x ="addedon=2019-11-21+17%3A06%3A42&productinfo=FINE&firstname=Creataum+Test+User&";
String pair[] = x.split("&");
Log.e("pairs", Arrays.asList(pair).toString());
for (int i=0;i<pair.length;i++){
String key[] = pair[i].split("=");
Log.e("pair:","key= "+ key[0]+" value= "+key[1]);
}
It seems the string is both URL encoded (the %3A) and JSON encoded (the &).
You have to decode the string and then split by '&' and then split each pair to key and value by '='.
You can see here how to JSON decode: Decoding JSON String in Java
URL decoding can be done with Java's URLDecoder class: https://docs.oracle.com/javase/7/docs/api/java/net/URLDecoder.html
For this example I'll just assume the only encoded characters are %3A and &.
String payumoney = "addedon=2019-11-21+17%3A06%3A42&productinfo=FINE&firstname=Creataum+Test+User&";
// String decoding.
payumoney = payumoney.replaceAll("%3A", "-");
payumoney = payumoney.replaceAll("&", "&");
HashMap<String, String> params = new HashMap<String, String>();
String[] pairs = payumoney.split("&");
for (String pair : pairs) {
String[] keyValue = pair.split("=");
params.put(keyValue[0], keyValue[1]);
}
This looks like a String with mixture of URL encoding (like %3A for :) and HTML characters (like & for &).
I believe you can try decoding it and then split data like say by & to get data for each key and then further split by = to get value for that key.
For URL decoding you can try like
String decoded = java.net.URLDecoder.decode(url, "UTF-8");
You can simply use String replaceAll() function to create the json.
str= str.replaceAll("=", "\"");
str= str.replaceAll("&", "\",\"");
str= "{\""+ str+ "\"}";

Error invalid int when parsing JSONObject into an integer

Basically I want to convert a JSONObject json into an integer (127181078). When I use this code:
int intOfReceivedID = Integer.parseInt(json);
I get this error message:
java.lang.NumberFormatException: Invalid int: 127181078"
When I use this code:
char[] charArray = json.toCharArray();
String stringCharArray = charArray.toString();
testTextView.setText(stringCharArray);
testTextView gives me: [C#2378e625
However, when I use this code:
preprocessedjson = String.valueOf(json);
testTextView.setText(preprocessedjson);
The TextView gives 127181078, but I get the some error when I parse the text to an integer.
Can anybody tell me what going on here?
And could you help me convert my JSONObject into an integer?
This is the php code:
$myfile = fopen($filename, 'r') or die("Unable to open file!");
echo fread($myfile,filesize($filename));
fclose($myfile);
This is the the makeHttpRequest:
JSONObject json = jparser.makeHttpRequest("http://myurl.nl/readspecifictextfile.php","POST",data);
This question is confusing but from your error message it looks like this is a Java question that has nothing to do with JSON since your json String in this case looks like it does not in fact contain json(from the exception message).
It looks like the issue is your json value is a number plus additional spaces which Integer.parseInt does not handle.
Try
Integer.parseInt(json.trim())
int intOfReceivedID = Integer.parseInt(json);
I get this error
message:
java.lang.NumberFormatException: Invalid int: 127181078"
This happens because there is a new-line character at the end of the ID which can not be parsed into an Integer.
When I use this code:
char[] charArray = json.toCharArray();
String stringCharArray = charArray.toString();
testTextView.setText(stringCharArray);
testTextView gives me: [C#2378e625
By default, calling toString() on an object prints the memory location of the object (in this case [C#2378e625). That's what's being displayed in the TextView.
However, when I use this code:
preprocessedjson = String.valueOf(json);
testTextView.setText(preprocessedjson);
The TextView gives 127181078, but I get the some error when I parse
the text to an integer.
You'll get an error when parsing the text to an integer because it still has an invalid new-line character at the end.
If you are receiving a JSONObject from the server which only contains a long, then you can use the getLong() or optLong() methods to retrieve the integer value. The JSON parser automatically handles all the parsing and you don't need to do any additional work.
JSONObject json = jparser.makeHttpRequest("http://myurl.nl/readspecifictextfile.php","POST",data);
final long receivedId = json.optLong();

How to Split response from Json in android?

I am developing an app in which I got response like "100.0" from server which I have to split to "100" and save in variable.How can I do that kindly tell me .
You can use this code to parse your JSON response. Store your wallet balance in a String, them trim the value as per your request
JSONObject object = new JSONObject(JsonResponseText);
String walletBal = object.getString("wallet balance");
String trimWalletBal = walletBal.subString(0,walletBal.indexOf('.'));
You can do it this way:
Integer value = jsonObject.getDouble("parameter").intValue();
Assuming that your problem is just to split the "Integer" and "Fraction" part of a "string" value you are getting from the server -
int decimalIdx = stringVal.indexOf('.');
if (decIdx != -1) {
return stringVal.substring(0, decIdx);
}
return stringVal;

How do I parse a HTTP Response of following format

I am using the bulk sms api to trigger send an sms to mobile number in and android phone. The format of the bulk sms api is follows
http://xxx.xxx.xxx/bulksms/bulksms?username=fds-xxx&password=xxx&type=0&dlr=1&destination=9422522891,8275004333&source=xxx&message=18%20December
The following is the response I can get in android as string using code
bytesSent = httpclient.execute(httppost, res);
response below
1701|919422522891:224c1214-bb95-414d-ba76-77db95370545,1701|918275004333:5e93a439-2644-4455-9f01-f27e6cf0cde6
How do I parse this response like key value pairs ?
A little success with following code , but it fails when the regex char is '|'
public String[] split(String regex,String input)
{
input = "1701|919422522891:224c1214-bb95-414d-ba76-77db95370545,1701|918275004333:5e93a439-2644-4455-9f01-f27e6cf0cde6";
regex = "|"; // does not work
//regex = ":"; // works correct
String[] soso = Pattern.compile(regex).split(input, input.length());
for (String s : soso) {
Log.e("TAG",s.toString());
}
return null;
}
for regex char '|'
I get a Log output as single characters string array like {"1","7","0",........}
UPDATE
regex = "\\|" // works fine
Use the split() method of String to split the response into different entries.
Loop through the resulting array
use split() again to separate keys from values
store the result in a map, result[0] is the key,result[1] is the value
if you need to maintain order make sure you use a map that does that, e.g. LinkedHashMap

Not able to get name/value pairs from JSON object, when using variable

Not able to get name/value pairs from JSON object, when using the variable but able to read it when hard coding the name.
To better explain :
1) My JSON object is like this -
{.....
{ "rates":{ "name1": value1, "name2": value2 ...etc }
...}
2) I am able to read this object in my android app.
3) Now this rate object name value pairs, i am trying to read based on user input -
String s1 = '"'+name1+'"'; // here name1 i got from user input, & converted into string
4) Now when i am trying to get the value from rates object, i am getting null exception -
JSONObject rateObject = jObject.getJSONObject("rates"); //able to get
complete object
String rate1 = (String) rateObject.get(s1); // giving NULL exception
5) But if i use hard code string, it works -
String rate1 = (String) rateObject.get("name1"); // working
Any pointers why its not working while using variable.
thanks
Thanks for suggestions, i sorted out the problem. There are 2 mistakes i was doing - 1) Using the quotes as correctly pointed out by others and 2) casting the double value to string. Correcting both has resolved my problem :)
In terms of your final code snippet, you are actually doing
String rate1 = (String) rateObject.get("\"name1\""); //note the extra quotes
because you have bookended the user input string with double-quote characters. You just want the input string itself with no bookending. The quotes in the JSON notation serve to delineate each key name; the quotes are not part of the key name itself.
You need to omit the quotes when you create s1:
String s1 = name1;
Or, if name1 is not a String already:
String s1 = name1.toString();
Replace:
String s1 = '"'+name1+'"';
with:
String s1 = name1;

Categories

Resources