بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

Cache یک json - چگونه؟ (حل شد.)

مدیریت گفتگو
Mim 11 سال پیش
آخرین تغییر: 9 سال پیش

سلام

 

یه برنامه از طریق json از سرور یه آرایه دریافت میکنه. چطور میشه این json یا آرایه رو cache کرد؟

ممنون میشم اگه کد بنویسید و توضیحات کامل باشه. سپاس

نظرات

کاشی زاده 11 سال پیش
بخش بیست و چهارم - این همه پروژه ، ماژول وب سرویس . این آموزش رو مطالعه کنید به صورت کامل در این مورد توضیح دادن استاد .
Mim 11 سال پیش
خیلی ممنونم. اما یک مشکل هست، جیسونی که در این پروژه تولید میشه کوچیکه و میشه داخل String ذخیره کرد و مشکلی پیش نمیاد. اما من یه جیسون خیلی خیلی بزرگ دارم. چطور باید سورسو تغییر بدم؟ میشه راهنمایی کنید. ممنونم
CodeMaster 11 سال پیش
خوب چه فرقی داره؟ در هر صورت شما اطلاعاتو تو یک فایل ذخیره میکنید حالا می خواهد کوچک باشه یا بزرگ
Mim 11 سال پیش
ارور میده خب. Unterminated string at character 29734 . کاراکتر 29734 هم حرف i هست. از اونجا به بعد بقیه کاراکترهارو ؟؟؟؟؟؟؟؟؟؟؟ نشون میده تا آخر. من حدس میزنم مشکلش کمبود فضا باشه.
CodeMaster 11 سال پیش
نه احتمالا از سمت سرور این ارور باشه چون Unterminated به معنی ناقصه احتمالا اونور مشکلی دارید یک چکی بزنید
Mim 11 سال پیش
برنامه بدون کش درست عمل میکنه. فقط وقتی از فایل کش استفاده میکنه این مشکل پیش میاد.
Mim 11 سال پیش
وقتی طول جیسون رو کم میکنم برنامه درست کار میکنه. فقط موقعی که جیسون خیلی طولانی هست این اتفاق میوفته.
کاشی زاده 11 سال پیش
در واقع این ارور Unterminated string at character به شما میگه که در خونه 29734 یک کارکتری وجود داره که نمیشه ازش استفاده در جیسون استفاده کرد مثل \ , @ , & , # و ...برای رفع مشکل شما باید این کارکتر رو به hex تبدیل کنید و بعد ارسال کنید .
Mim 11 سال پیش
ممنونم که پیگیری میکنین. ولی اگه مشکل این باشه. ینی یکی از این کاراکترا هست، چرا وقتی مستقیم از سرور میخونه درست اجرا میشه؟ ینی جیسون رو از سرور میگیره درست اجرا میشه.
کاشی زاده 11 سال پیش
احتمال داره موقع ذخیره کردن String در فایل ، رشته شکسته بشه و یکسری اطلاعات به صورت غلط ذخیره بشه شما بهتره قبل از ارسال به جای استفاده از کارکتر های خاص به صورت مستقیم از کد hex استفاده کنید .
Mim 11 سال پیش
فکرمیکنم به جای ArrayList باید از ArrayList استفاده کنم! چون روی سرور یه آرایه دارم که داخلش آرایه هست! آیا ممکنه مشکل این باشه؟
Mim 11 سال پیش
به جای ArrayList_NameValuePair از ArrayList_String
Mim 11 سال پیش
من هیچ کاراکتر خاصی ندارم. محتوای آرایه ی روی سرور url هست. آیا تابع خاصی وجود داره برای استفاده و جلوگیری از این مشکل؟

پاسخ‌ها 5

Mim 11 سال پیش

نظرات

hamidd 11 سال پیش
اگه مشکل تون اینه که json قابل پردازش نیست و از کاراکتر های خاصی درش استفاده شده که قابل تجزیه نیست (همون مشکلی که محمدحسین اشاره کرد) باید اون کارکترهای خاص رو escape کنید.به این لینک هم سری بزنید خوبه.
Mim 11 سال پیش
نه من هیچ کاراکتر خاصی ندارم. مطمئنم.
Mim 11 سال پیش
جیسون خالص هست. فقط زمانی که در فایل cache ذخیره میشه و بعد از روی cache خونده میشه، خطا میده.
Mim 11 سال پیش
لطفا بفرمایید که buffer و String یا هر نوع دیگه ای که برای ذخیره سازی توی این پروژه استفاده شده محدودیت اندازه نداره؟ چون طول جیسون من خیلی بالاست و نیاز دارم بیشتر هم بشه.
hamidd 11 سال پیش
منظورتون کدوم پروژه هست. اگه منظورتون بخش بیست و چهارم آموزش هاست که من هنوز وقت نکردم آموزش ها رو ببینم.
Mim 11 سال پیش
آره بخش 24ام.
hamidd 11 سال پیش
طول json محدودیت خاصی نداره.فقط در بعضی زبان ها یا بعضی لایبراری های پردازش json ،محدودیت وجود داره.
Mim 11 سال پیش
طول جیسون من در حال حاضر 29733 کاراکتر هست و خطایی که میگیره شماره کاراکتر 29734 رو نشون میده!!!
hamidd 11 سال پیش
مشکل به خاطر طول json نیست. شما میگید وقتی در فایل ذخیره می کنید مشکل به وجود میاد.پس مشکل مال خواندن و نوشتن در فایله احتمالا. به صورت باینری در فایل بخونید و بنویسید تا هیچ کاراکتری تغییر نکنه.
Mim 11 سال پیش

این دوتا کار نوشتن و خوندن رو انجام میدن

     private void saveToCache(long when, String data) {
ObjectOutputStream outputStream = null;
try {
outputStream = new ObjectOutputStream(new FileOutputStream(cacheDir + "/" + cacheFileName));
outputStream.writeLong(when);
outputStream.writeInt(data.length());

outputStream.write(data.getBytes());
}
catch (StreamCorruptedException e) {
e.printStackTrace();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.flush();
}
catch (IOException e) {
e.printStackTrace();
}
try {
outputStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}

private String readFromCache() {
ObjectInputStream inputStream = null;
try {
inputStream = new ObjectInputStream(new FileInputStream(cacheDir + "/" + cacheFileName));
long when = inputStream.readLong();
long now = System.currentTimeMillis();
if (now - when > cacheExpireTime * 1000) {
new File(cacheDir + "/cache.dat").delete();
return null;
}

int bytesLength = inputStream.readInt();
byte[] buffer = new byte[bytesLength];
inputStream.read(buffer, 0, bytesLength);
String output = new String(buffer);
return output;
}
catch (StreamCorruptedException e) {
e.printStackTrace();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
}
return null;
}

نظرات

CodeMaster 11 سال پیش
خوب اولین ایرادی که داره اینه که شما فایل اشتباهی رو دارید پاک می کنید توی قسمت پاک کردن فایل به جای cache.dat همون cacheFineName روبدید
Mim 11 سال پیش
سپاس. ارور اصلی همچنان وجود داره!
Mim 11 سال پیش
مشکل حل شد. با اضافه کردن یه .dot درست شد. در تابع readFromCache بعد از اسم فایل کش. مشکل عجیبی بود!
Mim 11 سال پیش
کامنت بالا که کلا اشتباهه.
Mim 11 سال پیش

من جدا کلافه شدم.

فایل کش رو بررسی کردم و دیتا درست ذخیره میشه، فکرمیکنم مشکل از تابع read باشه. و جالب اینکه برای جیسون هایی که طول کمتر از 1012 کاراکتر دارن، درست اجرا میشه و مشکلی نداره. اما بالای این رقم نمیتونه دیتا رو بخونه!

 لطفا کمک کنید!

 


حل شد! تابع read فقط 1024 کاراکتر اول رو میخونه. بجای read() باید از readFully() استفاده کرد.

 

نظرات

شهابی 10 سال پیش
دقیقا منم همین مشکل داشتم ، مرسی مرتضی جان
پویا 9 سال پیش
آقا خیلی ممنون منم این مشکل رو داشتم کلی گشتم نفهمیدم چرا اینجوریه. ممنون
Pooya 10 سال پیش

با تشکر از مرتضی، برای توضیح بیشتر : در متد readFromCache  به صورت زیر تغییر رو ایجاد کنید.

inputStream.read(buffer, 0, bytesLenght);
تغییر کند به
inputStream.readFully(buffer, 0, bytesLenght);

نظرات

شهریار توکلی 10 سال پیش
یک سوال؟اطلاعتی که در کش ذخیره میشه بعد اینکه یه شرط قرار میدم میخام از کش بخونه ولی چیزی نمیخونه و لیست خالی نمایش میده.مشکل از کجاست ؟ این قضیه کش هم داستانی داره :|
Pooya 10 سال پیش
اگه کد کامل خوندن کش و آپدیتشو بزارین شاید بتونم کمکتون کنم . من یه مقدار کدهای استادو تغییر دادم چون باعث می شد همچین موردی پیش بیاد.
YouNes Sh 10 سال پیش
بچه ها نیاز نیست چک کنیم که فضای خالی رو مموری وجود داره بعد ذخیره کنه؟
شهریار توکلی 10 سال پیش

من دقیقا از کد استاد استفاده میکنم چند بار هم ویدئو رو دیدم ولی باز نشد اگه میتونین کدی که جواب گرفتین رو همینجا قرار بدین که خیلی خوب میشه.

 
privatevoid saveToCache(longwhen,String data){
ObjectOutputStream outputStream =null;
try{
outputStream =newObjectOutputStream(newFileOutputStream(cacheDir +"/"+ cacheFileName));
outputStream.writeLong(when);
outputStream.writeInt(data.length());

outputStream.write(data.getBytes());
}
catch(StreamCorruptedException e){
e.printStackTrace();
}
catch(FileNotFoundException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}finally{
if(outputStream !=null){
try{
outputStream.flush();
}
catch(IOException e){
e.printStackTrace();
}
try{
outputStream.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
}
privateString readFromCache(){
ObjectInputStream inputStream =null;
try{
inputStream =newObjectInputStream(newFileInputStream(cacheDir +"/"+ cacheFileName));
longwhen= inputStream.readLong();
long now =System.currentTimeMillis();
if(now -when> cacheExpireTime *1000){
newFile(cacheDir +"/cache.dat").delete();
returnnull;
}

int bytesLength = inputStream.readInt();
byte[] buffer =newbyte[bytesLength];
inputStream.read(buffer,0, bytesLength);
String output =newString(buffer);
return output;
}
catch(StreamCorruptedException e){
e.printStackTrace();
}
catch(FileNotFoundException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}finally{
try{
if(inputStream !=null){
inputStream.close();
}
}
catch(IOException e){
e.printStackTrace();
}
}
returnnull;
}

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .