Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

JSON сохранить "C:\temp\cv.txt" и обратно загрузить TJSONObject


Denh ©   (2013-11-19 23:43:00) 

Итак есть код:
function addItemToJsonArray(jsonString: string;valueToAddInToArray:string): string;
var
 LJsonObj: TJSONObject;
 jp: TJSONPair;
 jsArr: TJSONArray;
 i: Integer;
begin
 LJsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(jsonString),
   0) as TJSONObject;
 if not assigned(LJsonObj) then
   showmessage('looks like this is not JSON')
 else
 begin
   for i := 0 to LJsonObj.size - 1 do
   begin
     jp := LJsonObj.Get(i);
     if jp.JsonValue is TJSONArray then
     begin
       jsArr := jp.JsonValue as TJSONArray;
       jsArr.add(valueToAddInToArray);
     end;
   end;
 end;
 result:=LJsonObj.ToString;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.text:=addItemToJsonArray(edit1.text,edit2.text);

end;
он принимает JSON содержащий архив и строку которую нужно в этот архив добавить, пока добавляется что-то вроди - 'бла' все хорошо, как только добавляется чтото с '\', например 'c:\temp', следующее добавление элемента не проходит, потому как в строке появляются special characters, вопрос как правильно сохранять чтоб эти special characters в строку записывались в таком виде, чтоб на следующий раз их можно было опять грузить?


illya   (2014-02-06 19:11:00) [1]

вот еще, ToBytes метод возвращает строку с escape-символамию правда все Unicode символы возаращеются кодами. вот пример:

procedure TForm1.Button6Click(Sender: TObject);
var
 s:string;
 j:TJsonString;
  rez:TBytes;

begin
  s:='c:\te"st\'#10#13'New Line ё-=ъх.э,..s[waaàéèçù2'#$D840#$DC01' '#$006F+#$0308;
  j:=TJsonString.Create(s);
  SetLength(rez, j.EstimatedByteSize());
  j.ToBytes(rez,0);
  label1.Caption:=s;
  label2.Caption:= TEncoding.UTF8.GetString(rez);
end;
результат:
"c:\\te\"st\\\n\rNew Line \u0451-=\u044A\u0445.\u044D,..s[waa\u00E0\u00E9\u00E8\u00E7\u00F92\uD840\uDC01 o\u0308"


Den   (2013-11-22 13:40:00) [2]

Тю а кто вам сказал что я куда-то ушел:)


[ВладОшин]   (2013-11-22 13:38:00) [3]

такие люди психуют, уходят..
ты ж для тут - все и немного больше! твое появление, как солнце, а обсирание - как манна небесная.
Нет, я не могу, я щаз заплачу..

не уходи! Все прощу!!!!!!!!


Den   (2013-11-22 13:26:00) [4]

Тем не менее, вопрос что получится, если экранировать "\" остался не отвеченным.  - странно, вот же в этом ответе все -
function EscapeString(const AValue: string): string;
const
 ESCAPE = '\';
 // QUOTATION_MARK = '"';
 REVERSE_SOLIDUS = '\';
 SOLIDUS = '/';
 BACKSPACE = #8;
 FORM_FEED = #12;
 NEW_LINE = #10;
 CARRIAGE_RETURN = #13;
 HORIZONTAL_TAB = #9;
var
 AChar: Char;
begin
 Result := '';
 for AChar in AValue do
 begin
   case AChar of
     // !! Double quote (") is handled by TJSONString
     // QUOTATION_MARK: Result := Result + ESCAPE + QUOTATION_MARK;
     REVERSE_SOLIDUS: Result := Result + ESCAPE + REVERSE_SOLIDUS;
     SOLIDUS: Result := Result + ESCAPE + SOLIDUS;
     BACKSPACE: Result := Result + ESCAPE + 'b';
     FORM_FEED: Result := Result + ESCAPE + 'f';
     NEW_LINE: Result := Result + ESCAPE + 'n';
     CARRIAGE_RETURN: Result := Result + ESCAPE + 'r';
     HORIZONTAL_TAB: Result := Result + ESCAPE + 't';
     else
     begin
       if (Integer(AChar) < 32) or (Integer(AChar) > 126) then
         Result := Result + ESCAPE + 'u' + IntToHex(Integer(AChar), 4)
       else
         Result := Result + AChar;
     end;
   end;
 end;
end;

Дело ж не в ответе и не в придумывании своих костылей, а дело в том что я думал что делаю просто не то что-то, DBXJSON этож идет в стандартной поставке, JSON это ж просто набор букв в определенной последовательности, стандарт типа, так договорились делать и делают, вот я и думал что если есть стандартная библиотека то и работать она должна правильно, а выяснилось что надо свои костыли писать чтоб оно воркало. Так что все ответы про воробьев и про то что надо знать как оно работает ой вэй, короче и без вас разберусь:)


[ВладОшин]   (2013-11-21 09:18:00) [5]

в [1] было предложение попробовать экранирование

судя по ответу: Result + ESCAPE + REVERSE_SOLIDUS;
 ESCAPE = '\';
 REVERSE_SOLIDUS = '\';
это именно оно и было.

Тем не менее, вопрос что получится, если экранировать "\" остался не отвеченным.

За что мне нравится залетный воробей - нагадит и улетит


Den   (2013-11-20 23:45:00) [6]

А ну да и если кому интересно то вот  - http://stackoverflow.com/questions/11785963/how-do-i-convert-a-string-to-and-from-json-with-escaped-special-characters-using


Den   (2013-11-20 22:21:00) [7]

что бы работать с JSON надо знать что это такое - ух ты емае а мужики то и не знают:(

Ответ нашел уже всем спасибо, за что люблю всетаки Delphi сообщество это всегда за желание человеку не помочь а чето ляпнуть типа да ты не знаешь ниче.


Palladin   (2013-11-20 10:19:00) [8]

что бы работать с JSON надо знать что это такое


[ВладОшин]   (2013-11-20 10:02:00) [9]

а так если?
c:\\temp


Наверх

Титульная страница Поиск, карта сайта Написать письмо