JSON.NET ব্যবহার করে স্ট্রিংটি বৈধ JSON কিনা তা নিশ্চিত করার উপায়


147

আমার কাঁচা স্ট্রিং আছে আমি কেবল যাচাই করতে চাই যে স্ট্রিংটি বৈধ JSON কিনা। আমি JSON.NET ব্যবহার করছি।

উত্তর:


207

কোডের মাধ্যমে:

আপনার সেরা বাজি হ'ল পার্স ব্যবহার করা try-catchএবং ব্যর্থ হওয়ার ক্ষেত্রে ব্যতিক্রম ধরা। (আমি কোনও TryParseপদ্ধতি সম্পর্কে অবগত নই )

(JSON.Net ব্যবহার করে)

সহজ উপায় হবে Parseব্যবহার করে STRING JToken.Parse, এবং যদি স্ট্রিং দিয়ে শুরু হয় এছাড়াও চেক করতে {বা [সঙ্গে প্রান্ত }বা ]যথাক্রমে (এই থেকে ইনস্টল জোড়া উত্তর ) :

private static bool IsValidJson(string strInput)
{
    if (string.IsNullOrWhiteSpace(stringValue)) { return false;}
    strInput = strInput.Trim();
    if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
        (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
    {
        try
        {
            var obj = JToken.Parse(strInput);
            return true;
        }
        catch (JsonReaderException jex)
        {
            //Exception in parsing json
            Console.WriteLine(jex.Message);
            return false;
        }
        catch (Exception ex) //some other exception
        {
            Console.WriteLine(ex.ToString());
            return false;
        }
    }
    else
    {
        return false;
    }
}

জন্য পরীক্ষা যোগ করার কারণ {বা [ইত্যাদি যে ওপর ভিত্তি করে JToken.Parseযেমন মান বিশ্লেষণ করবে "1234"বা "'a string'"একটি বৈধ টোকেন হিসাবে। অন্য বিকল্পটি উভয় JObject.Parseএবং JArray.Parseপার্সিংয়ে ব্যবহার করা এবং তাদের মধ্যে কেউ সফল হয় কিনা তা দেখতে পারা যায় তবে আমি বিশ্বাস করি যে এটি পরীক্ষা করা আরও সহজ {}এবং []সহজ হওয়া উচিত। ( এটি নির্দেশ করার জন্য @ রিনো ডেভেলকে ধন্যবাদ )

JSON.Net ছাড়া

আপনি নেট নেট ফ্রেমওয়ার্ক 4.5 সিস্টেম.জসন নেমস্পেস ব্যবহার করতে পারেন:

string jsonString = "someString";
try
{
    var tmpObj = JsonValue.Parse(jsonString);
}
catch (FormatException fex)
{
    //Invalid json format
    Console.WriteLine(fex);
}
catch (Exception ex) //some other exception
{
    Console.WriteLine(ex.ToString());
}

(তবে, আপনাকে System.Jsonকমান্ডটি ব্যবহার করে নুগেট প্যাকেজ ম্যানেজারের মাধ্যমে ইনস্টল করতে হবে : PM> Install-Package System.Json -Version 4.0.20126.16343প্যাকেজ ম্যানেজার কনসোলে) ( এখান থেকে নেওয়া )

নন-কোড উপায়:

সাধারণত, যখন একটি ছোট জসন স্ট্রিং থাকে এবং আপনি জসন স্ট্রিংয়ে কোনও ভুল সন্ধান করার চেষ্টা করছেন, তখন আমি ব্যক্তিগতভাবে অন-লাইন সরঞ্জামগুলি ব্যবহার করতে পছন্দ করি । আমি সাধারণত যা করি তা হ'ল:

  • JSONLint JSON ভ্যালিডেটরে JSON স্ট্রিং আটকান এবং দেখুন এটির কোনও বৈধ JSON কিনা।
  • পরে সঠিক জেএসওনকে http://json2csharp.com/ এ অনুলিপি করুন এবং এর জন্য একটি টেম্পলেট শ্রেণি তৈরি করুন এবং তারপরে এটি JSON.Net ব্যবহার করে ডি-সিরিয়াল করুন।

3
রানটাইমে এটি কীভাবে করতে পারে। আমি বৈধতা যাচাইকরণের উদ্দেশ্যে চেষ্টা ব্যবহার করতে চাই না
user960567

1
আপনি আপনার JSON এর জন্য একটি স্কিমা তৈরি করতে পারেন এবং পরে সেই স্কিমার বিরুদ্ধে যাচাই করতে পারেন দেখুন: Json.NET 3.5 বিটা 2 - জেএসএন স্কিমা বৈধতা
হাবিব

1
কোনও চেষ্টা করেই ব্লক না করে এটি করার কোনও উপায়? আমি অজানা ব্যবহার না করে ট্রাই ব্লক ব্যবহার করি না। আমি জসনকনভার্ট.ট্রিডিসরিয়ালাইজ অবজেক্টের মতো কিছু খুঁজছি। অপারেশনাল ট্রাই ক্যাচগুলি কেবল প্লেইন কোড are
জর্দান

1
JSON.Net ব্যবহার হচ্ছে: এই আছে না একটি ব্যতিক্রম নিক্ষেপ: JToken.Parse("1234")! প্রথমে চেক করার জন্য ভাল ধারণা হতে পারে, যদি স্ট্রিংটি শুরু হয় [বা দিয়ে {। আর একটি বিকল্প ব্যবহার JObject.Parse()এবং JArray.Parse()
রাইনো ডেভেল

1
JToken.Parse("{a:1}")নেই না যদিও এই অবৈধ JSON হয় ব্যতিক্রম নিক্ষেপ - aউদ্ধৃত করা উচিত ( stackoverflow.com/q/949449/3116322 )
Andé

31

JContainer.Parse(str)স্ট্রিংটি বৈধ জাসন কিনা তা পরীক্ষা করার জন্য পদ্ধতিটি ব্যবহার করুন । যদি এটি ব্যতিক্রম ছুঁড়ে ফেলে তবে এটি কোনও বৈধ জাসন নয়।

JObject.Parse- স্ট্রিংটি বৈধ জেসন বস্তু
JArray.Parseকিনা তা পরীক্ষা করতে ব্যবহার করা যেতে পারে - স্ট্রিংটি বৈধ জেসন অ্যারে কিনা
JContainer.Parseতা পরীক্ষা করতে ব্যবহার করা যেতে পারে - জসন বস্তু এবং অ্যারে উভয়ই পরীক্ষা করতে ব্যবহার করা যেতে পারে


17
পার্স () পদ্ধতিটি এই স্তরে ঘোষিত হওয়ায় জে কনটেনারের পরিবর্তে জে টোকেন প্রকারটি ব্যবহার করা আরও বৈধ
ডেনিস দ্য মেনেসি

6
আমি ধরে নিচ্ছি যে আপনি জেএসওএন. নেট সম্পর্কে কথা বলছেন: জে কনটেনার সেভাবে কাজ করে না , কারণ এটি সমস্ত ওয়ান্টেড ক্ষেত্রে ব্যতিক্রম করবে না। উদাহরণ: JContainer.Parse("1234");
রাইনো ডেভেল

ভুল উত্তর, JContainer.Parse যে কোনও বিষয়ে কাজ করে
টুলকিট

19

হাবিবের উত্তরের ভিত্তিতে আপনি একটি এক্সটেনশন পদ্ধতি লিখতে পারেন:

public static bool ValidateJSON(this string s)
{
    try
    {
        JToken.Parse(s);
        return true;
    }
    catch (JsonReaderException ex)
    {
        Trace.WriteLine(ex);
        return false;
    }
}

যা এর পরে ব্যবহার করা যেতে পারে:

if(stringObject.ValidateJSON())
{
    // Valid JSON!
}

1
JToken.Parse(s);trueএমনকি ফিরে আসেJToken.Parse(123);
মেকলভ

2
trueএই JSON{A:{"B": 1}}
অবৈধটির

চমৎকার এক্সটেনশন পদ্ধতিটি রয়েছে :) যদিও এটি সম্ভবত "ইসভালিডজসন" হিসাবে আরও ভাল নামকরণ করা হবে।
ম্লাদেন বি।

11

কেবলমাত্র @ হাবিবের উত্তরে কিছু যুক্ত করতে, আপনি জেএসওএন কোনও বৈধ প্রকারের কিনা তাও পরীক্ষা করতে পারেন:

public static bool IsValidJson<T>(this string strInput)
{
    strInput = strInput.Trim();
    if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
        (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
    {
        try
        {
            var obj = JsonConvert.DeserializeObject<T>(strInput);
            return true;
        }
        catch // not valid
        {             
            return false;
        }
    }
    else
    {
        return false;
    }
}

7

আমি দেখতে পেয়েছি যে জটোকেন। পার্স ভুলভাবে অবৈধ জেএসওনকে পার্স করে যেমন নীচের বিষয়গুলি:

{
"Id" : , 
"Status" : 2
}

জেএসএন স্ট্রিংটি http://jsonlint.com/ এ আটকান - এটি অবৈধ।

সুতরাং আমি ব্যবহার:

public static bool IsValidJson(this string input)
{
    input = input.Trim();
    if ((input.StartsWith("{") && input.EndsWith("}")) || //For object
        (input.StartsWith("[") && input.EndsWith("]"))) //For array
    {
        try
        {
            //parse the input into a JObject
            var jObject = JObject.Parse(input);

            foreach(var jo in jObject)
            {
                string name = jo.Key;
                JToken value = jo.Value;

                //if the element has a missing value, it will be Undefined - this is invalid
                if (value.Type == JTokenType.Undefined)
                {
                    return false;
                }
            }
        }
        catch (JsonReaderException jex)
        {
            //Exception in parsing json
            Console.WriteLine(jex.Message);
            return false;
        }
        catch (Exception ex) //some other exception
        {
            Console.WriteLine(ex.ToString());
            return false;
        }
    }
    else
    {
        return false;
    }

    return true;
}

এখানেই না একটি অবৈধ JSON স্ট্রিং ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf এখানে তাদেরকে JSON স্ট্যান্ডার্ড ECMA ও অধীনে ডকুমেন্টেশন পয়েন্ট 5 তাদেরকে JSON মান আপনি দেখতে পারেন একটি মান মান হিসাবে নাল নিতে পারেন । সুতরাং এটি জসনলিন্ট ইন্টারপ্রেটারে কেবল একটি বাগ
ডোমিনিক

4
ডোমিনিক, আপনি যে লিঙ্কটি যুক্ত করেছেন তার আমার পঠন অনুসারে একটি জেএসওএন মানটির কিছু বৈধ টোকেন থাকতে হবে, আক্ষরিক নাল পাঠ্যটি নাল মানকে উপস্থাপন করে। বৈধ মানগুলি হ'ল একটি বস্তু, অ্যারে, সংখ্যা, স্ট্রিং, সত্য, মিথ্যা, বা নাল "আপনি উল্লেখ করেছেন সেই অনুসারে। আফিক্সের কোনও মান টোকেন সহ কোনও বৈধ মান নেই।
কীর্তল্যান্ডার

দেখে মনে হচ্ছে এটি অবৈধ JSON এর সাথে ঠিক আছে যা এর মতো দেখাচ্ছে{ name : "l am invalid JSON" }
Jon 49

2

J বিকল্প বিকল্প JSON.Net ব্যবহার করছে না ⚠️

নেট কোর /। নেট 5 এর জন্য ( এই লেখার পূর্বরূপ হিসাবে ) কেউ System.Text.Jsonনেমস্পেস এবং পার্স ব্যবহার করেও ব্যবহার করতে পারেন JsonDocument। উদাহরণস্বরূপ নামস্থান ক্রিয়াকলাপগুলির উপর ভিত্তি করে একটি এক্সটেনশন পদ্ধতি:

public static bool IsJsonValid(this string txt)
{
    try { return JsonDocument.Parse(txt) != null; } catch {}

    return false;
}

1

টম বিচের উত্তর সম্পর্কে; পরিবর্তে আমি নিম্নলিখিতটি নিয়ে এসেছি:

public bool ValidateJSON(string s)
{
    try
    {
        JToken.Parse(s);
        return true;
    }
    catch (JsonReaderException ex)
    {
        Trace.WriteLine(ex);
        return false;
    }
}

নিম্নলিখিত ব্যবহারের সাথে:

if (ValidateJSON(strMsg))
{
    var newGroup = DeserializeGroup(strMsg);
}

3
এটি কোনও উপন্যাস নয় - আপনি একটি এক্সটেনশন পদ্ধতিটি কোনও এক্সটেনশন পদ্ধতি না করে তৈরি করেছেন। টম বিচের উত্তর ইতিমধ্যে আপনার যা প্রয়োজন তা অর্জন করতে পারে (সাধারণভাবে, আমি এই ধরণের এক্সটেনশন পদ্ধতিগুলি যুক্ত করার বিষয়েও ভ্রান্ত হয়েছি string, তবে এই উত্তরটি আসলে একটি হওয়া উচিত) এখানে না বা খ) "আমি টম বিচের উত্তরটি ব্যবহার করেছি " না বলে বলুন এটি this, অর্থাৎ এটি কোনও এক্সটেনশান সদস্য না করেই) - এই উত্তর এবং রেফারেন্স করা উভয়েরই একই ব্রেভুইটি এবং দুর্বলতা রয়েছে। আপনার যদি এই বিষয়টি করা আবশ্যক তবে কেবলমাত্র অন্য উত্তরে একটি মন্তব্য দিন।
রুবেন বারটেলিংক

1

JToken.Typeএকটি সফল পার্স করার পরে উপলব্ধ। এটি উপরের উত্তরের কিছু উপস্থাপক দূর করতে এবং ফলাফলের সূক্ষ্ম নিয়ন্ত্রণের জন্য অন্তর্দৃষ্টি সরবরাহ করতে ব্যবহার করা যেতে পারে। সম্পূর্ণ অবৈধ ইনপুট (যেমন, "{----}".IsValidJson();এখনও একটি ব্যতিক্রম ছুঁড়ে ফেলবে)।

    public static bool IsValidJson(this string src)
    {
        try
        {
            var asToken = JToken.Parse(src);
            return asToken.Type == JTokenType.Object || asToken.Type == JTokenType.Array;
        }
        catch (Exception)  // Typically a JsonReaderException exception if you want to specify.
        {
            return false;
        }
    }

Json.Net রেফারেন্স এর জন্য JToken.Type: https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htm


0

এই পদ্ধতির জন্য বাহ্যিক গ্রন্থাগারগুলির প্রয়োজন নেই

using System.Web.Script.Serialization;
bool IsValidJson(string json)
    {
        try {
            var serializer = new JavaScriptSerializer();
            dynamic result = serializer.DeserializeObject(json);
            return true;
        } catch { return false; }
    }

0

হাবিবের উত্তরের উপর ভিত্তি করে এখানে একটি ট্রাইপারস এক্সটেনশন পদ্ধতি রয়েছে:

public static bool TryParse(this string strInput, out JToken output)
{
    if (String.IsNullOrWhiteSpace(strInput))
    {
        output = null;
        return false;
    }
    strInput = strInput.Trim();
    if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
        (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
    {
        try
        {
            output = JToken.Parse(strInput);
            return true;
        }
        catch (JsonReaderException jex)
        {
            //Exception in parsing json
            //optional: LogError(jex);
            output = null;
            return false;
        }
        catch (Exception ex) //some other exception
        {
            //optional: LogError(ex);
            output = null;
            return false;
        }
    }
    else
    {
        output = null;
        return false;
    }
}

ব্যবহার:

JToken jToken;
if (strJson.TryParse(out jToken))
{
    // work with jToken
}
else
{
    // not valid json
}

0

আমি এটি ব্যবহার করছি:

  internal static bool IsValidJson(string data)
  {
     data = data.Trim();
     try
     {
        if (data.StartsWith("{") && data.EndsWith("}"))
        {
           JToken.Parse(data);
        }
        else if (data.StartsWith("[") && data.EndsWith("]"))
        {
           JArray.Parse(data);
        }
        else
        {
           return false;
        }
        return true;
     }
     catch
     {
        return false;
     }
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.