প্রদত্ত স্ট্রিং জাভায় JSON বৈধ কিনা তা কীভাবে পরীক্ষা করবেন


155

জাভাতে আমি কীভাবে JSON স্ট্রিংকে বৈধতা দেব? বা আমি কি নিয়মিত এক্সপ্রেশন ব্যবহার করে পার্স করতে পারি?


জিএসনের সাথে পার্স করার চেষ্টা করবেন? রেজেক্সের মাধ্যমে যাচাই করা ভাল ধারণা নাও হতে পারে
শ্বরিয়া

2
json.org এর অনেকগুলি পার্সারের লিঙ্ক রয়েছে
মার্টিনকে

উত্তর:


261

একটি বন্য ধারণা, এটি বিশ্লেষণ করার চেষ্টা করুন এবং ব্যতিক্রমটি ধরুন:

import org.json.*;

public boolean isJSONValid(String test) {
    try {
        new JSONObject(test);
    } catch (JSONException ex) {
        // edited, to include @Arthur's comment
        // e.g. in case JSONArray is valid as well...
        try {
            new JSONArray(test);
        } catch (JSONException ex1) {
            return false;
        }
    }
    return true;
}

এই কোড ব্যবহার org.json তাদেরকে JSON এপিআই বাস্তবায়ন যে পাওয়া যায় GitHub উপর , ম্যাভেন মধ্যে এবং আংশিকভাবে Android এর উপর


2
এটি নিকটে, তবে জেএসএনআরএর জন্য একটি বৈধতা নিখোঁজ হয়েছে (আমি আরও উপযুক্ত উপায়ে এই পোস্টটি আপডেট করেছি)
আর্থার

9
আমি "hello 'হ্যালো': 'foo'} 'অবৈধ'" ({} এর বাইরে 'অবৈধ' যুক্ত) এর মতো একটি জেসন স্ট্রিং চেষ্টা করেছি, এবং JSONObject পার্সেক্সেপশন নিক্ষেপ করছে না। আমি org.json.JSONObject ব্যবহার করছি। এটি কি প্রত্যাশিত?
সোচি হায়াশি

16
আপনি JSONObject গ্রন্থাগারটির উল্লেখ করেন নি, আমি এটি স্ট্যান্ডার্ড জাভা
লিবিতে দেখিনি

6
এই সমাধান বেশিরভাগ ক্ষেত্রে কাজ করে তবে কিছু পরিস্থিতিতে ব্যর্থ হতে পারে। উদাহরণস্বরূপ, এটি বন্ধ বন্ধনীটির ঠিক আগে কমাটিকে অনুমতি দেয় যা আসলে একটি সিনট্যাক্স ত্রুটি। পড়ুন json.org/javadoc/org/json/JSONObject.html অন্যান্য কোণ ক্ষেত্রে জন্য।
Hua2308

9
আমি বুঝতে পারি না কেন পোস্টারগুলিকে কোড স্নিপেটের সাথে আমদানির বিবৃতি অন্তর্ভুক্ত করার জন্য বিরক্ত করা যায় না। এটি এখানে গুরুত্বপূর্ণ। এখানে দ্বিতীয় রেট করা উত্তরটি আরও ভাল।
seansand

100

জ্যাকসন গ্রন্থাগার

একটি বিকল্প জ্যাকসন লাইব্রেরি ব্যবহার করা হবে । প্রথমে সর্বশেষতম সংস্করণ আমদানি করুন (এখন)

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.0</version>
</dependency>

তারপরে, আপনি নিম্নলিখিত হিসাবে সঠিক উত্তরটি প্রয়োগ করতে পারেন :

import com.fasterxml.jackson.databind.ObjectMapper;

public final class JSONUtils {
  private JSONUtils(){}

  public static boolean isJSONValid(String jsonInString ) {
    try {
       final ObjectMapper mapper = new ObjectMapper();
       mapper.readTree(jsonInString);
       return true;
    } catch (IOException e) {
       return false;
    }
  }
}

গুগল জিএসওএন বিকল্প

আর একটি বিকল্প হ'ল গুগল জিসন ব্যবহার করা । নির্ভরতা আমদানি করুন:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.5</version>
</dependency>

আবার, আপনি প্রস্তাবিত সমাধানটি প্রয়োগ করতে পারেন:

import com.google.gson.Gson;

public final class JSONUtils {
  private static final Gson gson = new Gson();

  private JSONUtils(){}

  public static boolean isJSONValid(String jsonInString) {
      try {
          gson.fromJson(jsonInString, Object.class);
          return true;
      } catch(com.google.gson.JsonSyntaxException ex) { 
          return false;
      }
  }
}

একটি সাধারণ পরীক্ষা নিম্নলিখিত:

//A valid JSON String to parse.
String validJsonString = "{ \"developers\": [{ \"firstName\":\"Linus\" , \"lastName\":\"Torvalds\" }, " +
        "{ \"firstName\":\"John\" , \"lastName\":\"von Neumann\" } ]}";

// Invalid String with a missing parenthesis at the beginning.
String invalidJsonString = "\"developers\": [ \"firstName\":\"Linus\" , \"lastName\":\"Torvalds\" }, " +
        "{ \"firstName\":\"John\" , \"lastName\":\"von Neumann\" } ]}";

boolean firstStringValid = JSONUtils.isJSONValid(validJsonString); //true
boolean secondStringValid = JSONUtils.isJSONValid(invalidJsonString); //false

অনুগ্রহ করে লক্ষ্য করুন যে কমা কমা করার কারণে "মাইনর" সমস্যা হতে পারে যা মুক্তিতে স্থির করা হবে 3.0.0


যদিও এটি মেলে না এমন উদ্ধৃতিগুলি, বা অনুপস্থিত বন্ধনীগুলির মতো বড় জিনিসের জন্য কাজ করে, গসন সুখের সাথে একটি জেসন অ্যারেটিকে একটি পিছনের কমা দিয়ে পার্স করবে, যা আরএফসি-
4627- এর

@ ইউরিথমিয়া সত্য! সংস্করণ 3.0 এ তাদের সমস্যার সমাধান করা
JeanValjean

1
এটি {কী: মান}
কেও

2
new ObjectMapper().readTree("28xjRBuOQqupRopHeSuhRQ")জ্যাকসন ক্ষতি : ইন্টারনড (28) ব্যতীত পার্স। সত্যই প্রত্যাশিত নয় ...
এমগের্ট

1
যেহেতু আমি বুঝতে পারি এই সমাধানটি কেবল বৈধতা দেয় না, তবে পুরো জসনকে পার্স করে (এবং সঞ্চয় করে)। এটি সংখ্যাকে পূর্ণসংখ্যা / লং / ডাবল ইত্যাদিতে রূপান্তর করে এটি কেবল সিনট্যাক্স চেকের চেয়ে বেশি নয়, এটি মেমরিতে পুরো জসনকে সঞ্চয় করে। এটি নিবিড় লোডগুলির জন্য উল্লেখযোগ্য হতে পারে। সিনট্যাক্স চেক জন্য আরও ভাল সমাধান যদি বিদ্যমান?
javapowered

15

সঙ্গে গুগল Gson আপনি JsonParser ব্যবহার করতে পারেন:

import com.google.gson.JsonParser;

JsonParser parser = new JsonParser();
parser.parse(json_string); // throws JsonSyntaxException

3
নোট করুন যে এটি সীমাহীন স্ট্রিং আলায় "এসএসডিএফ" তে কোনও ত্রুটি ফেলে না
অ্যান্ড্রু

1
বা এটি JSON অ্যারেতে পিছনে থাকা কমাগুলিও প্রত্যাখ্যান করে না।
সোতিরিওস ডেলিমনলিস

আমি তাতে সত্যই বিশ্বাস করতে পারি না ... এটি বলে যে "সংরক্ষণ করুন" স্ট্রিংটি পার্সেবল।
ধেরিক

সতর্ক থাকুন যে gson উদাহরণ এখানে ব্যবহার কোমল যা এখনও অনেক বিচ্যুতি পারবেন পার্সিং মোড। আমার অন্যান্য উত্তরে টেস্টকেস এবং কঠোর বিশ্লেষণ উদাহরণ সহ আরও বিশদ দেখুন ।
ভাদজিম

14

আপনি JSONUtils লাইব্রেরিতে উপলব্ধ .mayBeJSON (স্ট্রিং স্ট্র্যাম) ব্যবহার করতে পারেন ।


হ্যাঁ ... এটি কাজ করছে ধন্যবাদ এনপিন্টি আমি জিএসনের সাথে চেষ্টা করছিলাম কিন্তু এরকম কোনও পদ্ধতি আমি দেখিনি।
সাপ্পু

@ সাপ্পু: যদি এই উত্তরটি আপনার প্রশ্নের সমাধান করে তবে তা চিহ্নিত করুন। বেশিরভাগ লাইব্রেরি একটি স্ট্রিং নিয়ে থাকে এবং এটি বিশ্লেষণের চেষ্টা করে, যদি পার্সিং ব্যর্থ হয়, অর্থাত্ স্ট্রিংটি বৈধ জেএসএন স্ট্রিং নয়, এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে।
npinti

@ এনপিন্টি: অতিরিক্ত for অতিরিক্ত বন্ধনীর সাথে অবৈধ স্ট্রিংয়ের জন্য সত্যটি ফিরে আসে =>}
বিবেক

3
এই পদ্ধতিটি কেবল আক্ষরিকভাবে পরীক্ষা করে থাকে যে স্ট্রিংটি কোট বা বন্ধনী দিয়ে শুরু হয় এবং শেষ হয়। খুব অবিশ্বাস্য।
মাইকেল মুন্সি

2
এজন্য পদ্ধতির নামটি 'সম্ভবত', 'নয়' নয় :)
খোয়া

5

এটি আপনার বৈধতার সাথে আপনি কী প্রমাণ করার চেষ্টা করছেন তার উপর নির্ভর করে। অন্যান্যরা যেমন পরামর্শ দিয়েছেন ঠিক তেমনই জসনকে পার্স করা রেজিক্সগুলি ব্যবহার করার চেয়ে ভাল, কারণ জেসনের ব্যাকরণ কেবলমাত্র রেজিক্সের সাথে প্রতিনিধিত্ব করার চেয়ে জটিল।

যদি জাসন কেবলমাত্র আপনার জাভা কোড দ্বারা পার্স করা যায় তবে তা যাচাই করতে একই পার্সার ব্যবহার করুন।

তবে কেবল পার্সিংটি আপনাকে অন্য পরিবেশে গ্রহণযোগ্য হবে কিনা তা আপনাকে অবশ্যই বলবে না। যেমন

  • অনেক পার্সার্স কোনও বস্তু বা অ্যারেতে ট্রেলিং কমাগুলি উপেক্ষা করে, তবে IE এর পুরানো সংস্করণগুলি ব্যর্থ হতে পারে যখন তারা একটি পিছনে কমাতে আঘাত করে।
  • অন্যান্য পার্সাররা ট্রেলিং কমা গ্রহণ করতে পারে তবে এর পরে একটি অপরিজ্ঞাত / নাল এন্ট্রি যুক্ত করতে পারে।
  • কিছু পার্সার অনাবৃত সম্পত্তি নামের অনুমতি দিতে পারে।
  • কিছু পার্সার স্ট্রিং-এ ASCII অক্ষরগুলিতে আলাদাভাবে প্রতিক্রিয়া জানাতে পারে।

যদি আপনার বৈধতা খুব পুঙ্খানুপুঙ্খভাবে প্রয়োজন হয় তবে আপনি এটি করতে পারেন:

  • আমি উপরে উল্লিখিত সমস্ত কোণার ক্ষেত্রে যেটি ব্যর্থ হয়েছে এমন কোনও সন্ধান না পাওয়া পর্যন্ত বিভিন্ন পার্সার চেষ্টা করুন
  • অথবা আপনি সম্ভবত জাভ্যাক্স.স্ক্রিপ্ট ব্যবহার করে জসনলিন্ট চালাতে পারেন * *,
  • বা জাভ্যাক্স.স্ক্রিপ্ট ব্যবহার করে জ্বিশিন্ট চালানোর সাথে পার্সার ব্যবহার করে একত্রিত করুন *

4
String jsonInput = "{\"mob no\":\"9846716175\"}";//Read input Here
JSONReader reader = new JSONValidatingReader();
Object result = reader.read(jsonInput);
System.out.println("Validation Success !!");

দয়া করে স্ট্রিংট্রি-জেসন লাইব্রেরি ডাউনলোড করুন


উপরের মতো একটি স্ট্রিং সংজ্ঞা দেওয়া সম্ভব? বা এটি কেবল আইডিয়া জন্য।
স্যান্ট্রন মণিভারতী

সম্ভব নয়, এটি আমার ভুলের কারণে হয়েছিল itsএর সংশোধন করুন। ধন্যবাদ
জামশেয়ার

1
জেএসএনভালিডেটিং রেডার জাভা এপিআই
ইগোরগানাপলস্কি

দয়া করে উল্লিখিত লাইব্রেরিটি ব্যবহার করুন, ধন্যবাদ
জামশেয়ার

2

পার্সিং সম্পর্কে কিছুটা:

জসন এবং প্রকৃতপক্ষে সমস্ত ভাষাতে ব্যাকরণ ব্যবহার করুন যা নিয়মের একটি সেট যা প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে। জসনকে পার্স করার জন্য, আপনাকে মূলত বিপরীতে সেই বিকল্পগুলি কার্যকর করতে হবে

জসন একটি প্রসঙ্গমুক্ত ব্যাকরণ , যার অর্থ আপনি অনন্তকালীন নেস্টেড অবজেক্ট / অ্যারে রাখতে পারেন এবং জসন এখনও বৈধ হবে। রেজেক্স কেবল নিয়মিত ব্যাকরণ পরিচালনা করে (তাই নামে 'রেগ'), যা প্রাসঙ্গিক মুক্ত ব্যাকরণগুলির একটি উপসেট যা অসীম বাসা বাঁধার অনুমতি দেয় না, সুতরাং সমস্ত বৈধ জেএসসনকে পার্স করার জন্য কেবল রেজেক্স ব্যবহার করা অসম্ভব। আপনি রেগেক্সের জটিল সেটগুলি এবং লুপগুলি এই ধারণার সাথে ব্যবহার করতে পারেন যে কেউ 100 টি স্তর গভীর করে বাসা বাঁধবে না, তবে এটি এখনও খুব কঠিন হবে difficult

আপনি যদি নিজের পার্সার লেখার জন্য প্রস্তুত হন
তবে ব্যাকরণটি বের করার পরে আপনি পুনরাবৃত্ত বংশোদ্ভূত পার্সার তৈরি করতে পারেন


2

প্রদত্ত স্ট্রিংটি কোটলিনে বৈধ জেএসএন কিনা তা পরীক্ষা করুন । আমি এমবিআইডি জাভার উত্তর কোটলিনে রূপান্তরিত করেছি

fun isJSONValid(test: String): Boolean {
    try {
        JSONObject(test);
    } catch (ex: JSONException) {
        try {
            JSONArray(test);
        } catch (ex1: JSONException) {
            return false;
        }
    }
    return true;
}

1

এখানে আপনি এমন একটি সরঞ্জাম খুঁজে পেতে পারেন যা একটি JSON ফাইলকে বৈধতা দিতে পারে, বা আপনি কোনও JSON লাইব্রেরির সাহায্যে আপনার JSON ফাইলটি deserialize করতে পারেন এবং যদি অপারেশন সফল হয় তবে এটি বৈধ হওয়া উচিত ( উদাহরণস্বরূপ, গুগল-জেসসন যদি ইনপুটটি ব্যতিক্রম করে দেয় তবে এটি পার্সিং বৈধ JSON নয়)।


1

প্লেফ্রেমওয়ার্ক ২. Using ব্যবহার করে জাভা এপি-তে পাওয়া জসন লাইব্রেরিটি কেবল স্ট্রিংকে বিশ্লেষণ করতে ব্যবহার করা যেতে পারে। স্ট্রিংটি হয় জসন অ্যারের জেসন উপাদান হতে পারে। যেহেতু এখানে প্রত্যাবর্তিত মানটির গুরুত্ব নেই তবে আমরা স্ট্রিংটি সঠিক জেসন স্ট্রিং কিনা তা নির্ধারণের জন্য কেবল পার্স ত্রুটিটি ধরি।

    import play.libs.Json;

    public static Boolean isValidJson(String value) {
        try{
            Json.parse(value);
            return true;
        } catch(final Exception e){
            return false;
        }
    }

1

আইএমএইচও, সবচেয়ে মার্জিত উপায়ে JSON প্রসেসিংয়ের জন্য জাভা API ব্যবহার করছে (JSON-P), JSR 374 অনুসারে জাভা EE মানগুলির মধ্যে একটি ।

try(StringReader sr = new StringReader(jsonStrn)) {
    Json.createReader(sr).readObject();
} catch(JsonParsingException e) {
    System.out.println("The given string is not a valid json");
    e.printStackTrace();
}

মাভেন ব্যবহার করে, জেএসএন-পি-তে নির্ভরতা যুক্ত করুন:

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1.4</version>
</dependency>

পরিদর্শন তাদেরকে JSON-পি কর্মকর্তা পৃষ্ঠা আরও তথ্য জন্য।


1

কড়া জসন জিএসন লাইব্রেরিতে পার্সিংয়ের একটি কার্যকারী উদাহরণ এখানে :

public static JsonElement parseStrict(String json) {
    // throws on almost any non-valid json
    return new Gson().getAdapter(JsonElement.class).fromJson(json); 
}

আরও অন্যান্য বৈধ-উদাহরণ সহ আরও তথ্য এবং বর্ধিত পরীক্ষার ক্ষেত্রে জিএসওএন ব্যবহার করে জাভাতে জেএসএন বৈধ কিনা তা যাচাই করার জন্য আমার অন্যান্য বিস্তারিত উত্তরও দেখুন ।


1

আপনি দেখতে পাচ্ছেন যে এর অনেকগুলি সমাধান রয়েছে, তারা এটি যাচাই করতে প্রধানত JSON কে পার্স করে এবং শেষে আপনাকে নিশ্চিত হওয়ার জন্য এটি পার্স করতে হবে।

তবে, প্রসঙ্গের উপর নির্ভর করে আপনি একটি প্রাক-চেক দিয়ে পারফরম্যান্সগুলি উন্নত করতে পারেন।

আমি যখন API গুলি কল করি তখন আমি যা করি তা কেবল প্রথম অক্ষরটি '{' এবং শেষটি '}'} যদি এটি না হয় তবে আমি পার্সার তৈরি করতে বিরত হই না।


0

আমি এর জন্য খুব সহজ সমাধান খুঁজে পেয়েছি।

প্রথমে net.sf.json-libএটির জন্য এই গ্রন্থাগারটি ইনস্টল করুন ।

    import net.sf.json.JSONException;

    import net.sf.json.JSONSerializer;

    private static boolean isValidJson(String jsonStr) {
        boolean isValid = false;
        try {
            JSONSerializer.toJSON(jsonStr);
            isValid = true;
        } catch (JSONException je) {
            isValid = false;
        }
        return isValid;
    }

    public static void testJson() {
        String vjson = "{\"employees\": [{ \"firstName\":\"John\" , \"lastName\":\"Doe\" },{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" },{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }]}";
        String ivjson = "{\"employees\": [{ \"firstName\":\"John\" ,, \"lastName\":\"Doe\" },{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" },{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }]}";
        System.out.println(""+isValidJson(vjson)); // true
        System.out.println(""+isValidJson(ivjson)); // false
    }

সম্পন্ন. উপভোগ করুন


0

উত্তরগুলি আংশিকভাবে সঠিক। আমিও একই সমস্যার মুখোমুখি হয়েছি। জসনকে পার্স করা এবং ব্যতিক্রমের জন্য যাচাই করা স্বাভাবিক উপায় বলে মনে হচ্ছে তবে সমাধানটি ইনপুট জেসসনের মতো ব্যর্থ

output "আউটপুটভ্যালুশেমা ফর্ম্যাট": "", "সর্টবাই ইন্ডেক্সআইএনআরকর্ড": 0, "বাছাই অর্ডার": 847874874387209 "অবতরণ" aj kajhfsadkjh

আপনি দেখতে পাচ্ছেন যে জেসনটি অবৈধ কারণ এখানে আবর্জনার অক্ষর রয়েছে। তবে আপনি যদি জ্যাকসন বা জিএসসন ব্যবহার করে উপরের জসনকে বিশ্লেষণ করার চেষ্টা করেন তবে বৈধ জসন এবং আবর্জনা অনুসরণের অক্ষরগুলির পার্সযুক্ত মানচিত্রটি উপেক্ষা করা হবে। যখন আপনি জসন বৈধতা যাচাইয়ের জন্য পার্সার ব্যবহার করছেন তখন প্রয়োজনীয় সমাধান নয়।

এই সমস্যার সমাধানের জন্য এখানে দেখুন

পিএস: এই প্রশ্নটি আমার দ্বারা জিজ্ঞাসা করা হয়েছিল এবং উত্তর দেওয়া হয়েছিল।


0
import static net.minidev.json.JSONValue.isValidJson;

এবং তারপরে আপনার JSON স্ট্রিংয়ে এই ফাংশনটি কল করুন :)


0
public static boolean isJSONValid(String test) {
    try {
        isValidJSON(test);
        JsonFactory factory = new JsonFactory();
        JsonParser parser = factory.createParser(test);
        while (!parser.isClosed()) {
            parser.nextToken();
        }
    } catch (Exception e) {
        LOGGER.error("exception: ", e);
        return false;
    }
    return true;
}

private static void isValidJSON(String test) {
    try {
        new JSONObject(test);
    } catch (JSONException ex) {
        try {
            LOGGER.error("exception: ", ex);
            new JSONArray(test);
        } catch (JSONException ex1) {
            LOGGER.error("exception: ", ex1);
            throw new Exception("Invalid JSON.");
        }
    }
}

উপরের সমাধান উভয় পরিস্থিতিতেই কভার করে:

  • সদৃশ কী
  • মেলে না এমন উক্তি বা অনুপস্থিত বন্ধনী ইত্যাদি

0

javax.jsonলাইব্রেরি ব্যবহার করে একটি সমাধান :

import javax.json.*;

public boolean isTextJson(String text) {
    try {
        Json.createReader(new StringReader(text)).readObject();
    } catch (JsonException ex) {
        try {
            Json.createReader(new StringReader(text)).readArray();
        } catch (JsonException ex2) {
            return false;
        }
    }
    return true;
}

0

আপনি ভ্যালিডলWellFormedJson থেকে ক্লাস ব্যবহার করতে পারেন ঘোষণামূলক বৈধতা লাইব্রেরি ।

ঘোষণা নিজেই নিম্নলিখিতগুলির মতো দেখতে পারে:

new WellFormedJson(
    new Unnamed<>(Either.right(new Present<>(jsonRequestString)))
)

চেক ফেজটি দেখতে দেখতে:

    Result<JsonElement> result =
        (new WellFormedJson(
            new Named<>(
                "vasya",
                Either.right(
                    new Present<>(
                        "{\"guest\":{\"name\":\"Vadim Samokhin\",\"email\":\"samokhinvadim@gmail.com\"},\"source\":1,\"items\":[{\"id\":1900},{\"id\":777}]}"
                    )
                )
            )
        ))
            .result();

    assertTrue(result.isSuccessful());
    assertEquals(
        "{\"guest\":{\"name\":\"Vadim Samokhin\",\"email\":\"samokhinvadim@gmail.com\"},\"source\":1,\"items\":[{\"id\":1900},{\"id\":777}]}",
        result.value().raw().toString()
    );
    assertEquals(
        "{\"name\":\"Vadim Samokhin\",\"email\":\"samokhinvadim@gmail.com\"}",
        result.value().raw().getAsJsonObject().get("guest").toString()
    );

এ জাতীয় কোনও সাধারণ কাজের জন্য এটি ওভারকিলের মতো বলে মনে হতে পারে তবে কোনও জটিল অনুরোধটি যাচাই করতে হবে যখন তা জ্বলে। বৈধলের দ্রুত শুরু বিভাগটি দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.