You weren't kidding. I checked the compiled JS, and there it is (with some
smarts to minimise the JS it looks like):
this.a = new U2b(d,c,(n = {
iceServers: m
},
new RTCPeerConnection(n)));
Thanks for letting me know about JsonUtils.safeEval(...) That is a better
option.
I never had much luck with JsInterop. I just tried it again, trying to map
the RTCPeerConnection
<https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection>,
but it doesn't work giving me "TypeError: Cannot read properties of
undefined" when I try to instanciate it. I also can't debug it, as I can't
step into the constructor to see what's going wrong.
This was my failed attempt:
@JsType(isNative = true)
public class RTCPeerConnection {
@JsConstructor
public RTCPeerConnection(JavaScriptObject iceServersJsoArray) {
super();
}
public native void close();
}
On Sunday 7 April 2024 at 4:20:48 am UTC+10 Thomas Broyer wrote:
> There's no escaping. You have a string value, it stays a string value. If
> its content is JSON representing an array and you want that array, then
> indeed you have to parse the JSON.
>
> It looks like there's a major misunderstanding about what GWT does with
> your code, and/or possibly where/when the code runs or something.
> GWT "only" translates the Java syntax to JS (and also optimizes
> everything), and therefore comes with a library of classes that emulates
> the Java runtime core classes so they can also be translated the same way
> as your code. JSNI is an escape hatch to be able to "put JS syntax inside
> your Java syntax", but that's all.
> In other words, if you have a string "[ 42, true, null ]" in a variable
> (that you retrieved from your server), if you call that method, it's
> exactly equivalent to this JS:
> var iceServersJson = "[ 42, true, null ]";
> var peerConnectionConfig = {
> iceServers: iceServersJson
> };
> i.e. the peerConnectionConfig object has an iceServers property whose
> value is just the iceServersJson string value.
> GWT won't "magically" generate JS code at runtime replacing the value
> as-is to form some new JS each time, i.e. it *won't* become:
> var peerConnectionConfig = {
> iceServers: [ 42, true, null ]
> };
> No, really, that Java/JSNI function is transformed to this JS function:
> function createPeerConnection(iceServersJson) {
> var peerConnectionConfig = {
> iceServers: iceServersJson
> };
> return new RTCPeerConnection(peerConnectionConfig);
> }
> and then at one point you call it. It's your job to give it either a
> string value or parse the string value as JSON and passe the result.
>
> Kudos to resurrecting a 15 years old post though! 🤣
>
> BTW, you may want to prefer JsonUtils.safeEval(iceServersJson) here:
> https://www.gwtproject.org/javadoc/latest/com/google/gwt/core/client/JsonUtils.html
>
> (and actually you may want to move to using JsInterop rather than JSNI, and
> maybe Elemental 2)
>
> On Saturday, April 6, 2024 at 8:01:13 AM UTC+2 [email protected]
> wrote:
>
>> I ran into this. GWT is too smart sometimes. :)
>>
>> For my example, I was querying an API for WebRTC ICE servers, which
>> returned a string which was a JSON array.
>>
>> When I had:
>>
>> private static native JavaScriptObject createPeerConnection(String
>> iceServersJson) /*-{
>> var peerConnectionConfig = {
>> iceServers: iceServersJson
>> };
>> return new RTCPeerConnection(peerConnectionConfig);
>> }-*/;
>>
>> GWT excaped the quotes, so iceServers switched from an array, to just a
>> string, exactly like I asked it to.
>>
>> So, really, I needed what Thomas suggested:
>>
>> JavaScriptObject iceServersObj = ((JSONArray)JSONParser.parseStrict(
>> iceServersJson)).getJavaScriptObject();
>>
>> private static native JavaScriptObject createPeerConnection(JavaScriptObject
>> iceServersJson) /*-{
>> var peerConnectionConfig = {
>> iceServers: iceServersJson
>> };
>> return new RTCPeerConnection(peerConnectionConfig);
>> }-*/;
>>
>> Now I'm telling GWT it's a JSO, and GWT knows not to escape it.
>>
>> On Monday 9 November 2009 at 10:25:24 pm UTC+11 Thomas Broyer wrote:
>>
>>>
>>>
>>> On Nov 9, 11:47 am, peterk <[email protected]> wrote:
>>> > I'm having some trouble dealing with escaping and unescaping of Java
>>> > strings for encoding in JSON.
>>> >
>>> > I use JSONString to encode a Java string and that seems to work ok.
>>> > For example, newlines turn into \n, tabs turn into \t and so on.
>>> >
>>> > However, given this escaped sequence back, how to I turn this back
>>> > into an unescaped javastring wheren \n is turned into a newline and so
>>> > on?
>>> >
>>> > If I use stringvalue() on the JSONString it just gives back the same
>>> > json encoded string with the \n and \t encoding etc.
>>> >
>>> > Anyone have any ideas? :)
>>>
>>> JSONParser.parse? ;-)
>>
>>
--
You received this message because you are subscribed to the Google Groups "GWT
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/google-web-toolkit/1826a2dc-6c1b-4b0c-99de-d6f48828c18an%40googlegroups.com.