![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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