Мутация строки - PullRequest
       4

Мутация строки

0 голосов
/ 04 декабря 2011

У меня есть служба .Net WCF Rest, возвращающая Json для использования приложением Android.

При отладке служба WCF правильно возвращает возвращаемое значение (Json) в виде:

{"BaseLoyaltyPoints":1480,"BonusLoyaltyPoints":0,"BrandId":1414, [etc...] }

Также в отладке, когда он возвращается в Блокнот, возвращаемое значение было изменено на:

{\"BaseLoyaltyPoints\":1480,\"BonusLoyaltyPoints\":0,\"BrandId\":1414, [etc...] }

А когда оно попадает в мое приложение для Android, оно становится:

{\\"BaseLoyaltyPoints\\":1480,\\"BonusLoyaltyPoints\\":0,\\"BrandId\\":1414, [etc...] }

Вот стандартный код, который я использую для сериализации Json:

Dim stream1 As MemoryStream = New MemoryStream
Dim ser As DataContractJsonSerializer = New DataContractJsonSerializer(GetType(FullProduct))
ser.WriteObject(stream1, Me)

Dim _json As String = Encoding.UTF8.GetString(stream1.ToArray())
stream1.Close()

Код Android для получения Json:

HttpClient httpclient = new DefaultHttpClient();
HttpGet request = new HttpGet(getString(R.string.CONST_RestService) + "/json/Product/" + productID);
ResponseHandler<String> handler = new BasicResponseHandler();       
result = httpclient.execute(request, handler);  
jObject = new JSONObject(result);

Что происходит?

Спасибо

Дейв

1 Ответ

0 голосов
/ 04 декабря 2011

Данные JSON должны быть оцениваемой строкой JavaScript - «символ должен быть экранирован в \» (символ «в противоположность ограничителю строки»), а символ \ в этом выражении также должен экранироваться ( потому что \ также является специальным символом). Так что это была эта строка все время, она каждый раз печаталась по-разному.

Взять этот JavaScript для примера:

object = JSON.parse("{\"hello\":\"World\"}");
alert(object.hello);

Следующее является скорее предположением, чем фактическим знанием, потому что я не знаю, как именно ведут себя используемые вами классы, но я думаю, что это правильно.

Как видите, символы " необходимо экранировать до \", поэтому ваш сериализатор .NET JSON делает именно это. Все хорошо, интерпретируя это как JS будет работать как ожидалось.

Теперь , вероятно, происходит из-за того, что ваш конструктор JSONObject не ожидает, что строки уже должным образом экранированы, поэтому он сам это делает. Чтобы уточнить: когда вы говорите «с одним escape-символом», вы, вероятно, имеете в виду что-то вроде этого:

String workingJSONString = "{\"Hello\":\"World\"}"

право? Проблема здесь в том, что Java имеет те же правила экранирования, что и JavaScript - это не то, что вы получаете из своего HTTPRequest, а то, что вы получаете

String youGotThis = "{\\\"Hello\\\":\\\"World\\\"}"

Потому что в вашей String есть буквальные обратные слеши, и их тоже нужно избегать. Я совершенно уверен, что это именно то, что происходит, и вам, вероятно, придется либо сказать своему сериализатору .NET JSON не применять управляющие правила, либо найти что-то, что создает JSONObject из правильно экранированной строки JSON, либо удалить ненужные экранированные символы. сами.

Надеюсь, это помогло - но опять же, я не совсем уверен, поэтому вам следует просто проверить, действительно ли он ведет себя так, как я сказал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...