JSON মধ্যে নিল প্রতিনিধিত্ব




jackson gson (5)

JSON মধ্যে নাল মান ফেরত জন্য পছন্দের পদ্ধতি কি? Primitives জন্য একটি ভিন্ন পছন্দ আছে?

উদাহরণস্বরূপ, সার্ভারে আমার অবজেক্টটির কোনও মান ছাড়াই "myCount" নামক একটি ইন্টিগ্রার থাকে, তবে সেই মানটির জন্য সর্বাধিক সঠিক JSON হবে:

{}

অথবা

{
    "myCount": null
}

অথবা

{
    "myCount": 0
}

স্ট্রিংগুলির জন্য একই প্রশ্ন - যদি আমার সার্ভারে একটি নল স্ট্রিং "MyString" থাকে, তবে এটি সেরা JSON:

{}

অথবা

{
    "myString": null
}

অথবা

{
    "myStrung": ""
}

অথবা (প্রভু আমাকে সাহায্য করুন)

{
    "myString": "null"
}

আমি খালি সংগ্রহ হিসাবে JSON এ উপস্থাপিত সংগ্রহগুলির জন্য কনভেনশন পছন্দ করি http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html

একটি খালি অ্যারে প্রতিনিধিত্ব করা হবে:

{
    "myArray": []
}

সামিট সম্পাদন করুন

'ব্যক্তিগত পছন্দ' যুক্তি বাস্তবসম্মত বলে মনে হয়, তবে এতে সামান্য সংকীর্ণতা দেখা দেয়, কারণ সম্প্রদায়টি আরও বেশি অসম্পূর্ণ পরিষেবা / উত্স গ্রহণ করবে। JSON কাঠামোর জন্য কনভেনশনগুলি সাধারণ পরিষেবা ব্যবহার এবং পুনঃব্যবহারকে সহায়তা করবে। যতদূর পর্যন্ত একটি আদর্শ প্রতিষ্ঠা করা হচ্ছে, আমি কয়েকটি ব্যতিক্রম সহ বেশিরভাগ জ্যাকসন সম্মেলনকে গ্রহণ করার পরামর্শ দেব:

  • বস্তু primitives উপর পছন্দ করা হয়।
  • খালি সংগ্রহ নাল উপর পছন্দসই।
  • কোন মান সঙ্গে বস্তু নল হিসাবে প্রতিনিধিত্ব করা হয়।
  • Primitives তাদের মান ফিরে।

যদি আপনি বেশিরভাগ নুল মানের সাথে JSON অবজেক্টটি ফেরত দিচ্ছেন, তবে আপনার কাছে একাধিক পরিষেবাদিতে পুনঃবিনিয়োগের জন্য প্রার্থী থাকতে পারে।

{

    "value1": null,

    "value2": null,

    "text1": null,

    "text2": "hello",

    "intValue": 0, //use primitive only if you are absolutely sure the answer is 0

    "myList": [],

    "myEmptyList": null, //NOT BEST PRACTICE - return [] instead

    "boolean1": null, //use primitive only if you are absolutely sure the answer is true/false

    "littleboolean": false

}

উপরের JSON নিম্নোক্ত জাভা বর্গ থেকে তৈরি করা হয়েছিল।

package jackson;

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonApp {

    public static class Data {

        public Integer value1;

        public Integer value2;

        public String text1;

        public String text2 = "hello";

        public int intValue;

        public List<Object> myList = new ArrayList<Object>();

        public List<Object> myEmptyList;

        public Boolean boolean1;

        public boolean littleboolean;

    }

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writeValueAsString(new Data()));
    }
}

মেনন নির্ভরতা:

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

আমি ডাটা প্রকারের পরিবর্তনশীল (স্ট্রিং / বস্তুর জন্য null , সংখ্যাগুলির জন্য 0 ) জন্য "ডিফল্ট" বাছাই করব, কিন্তু প্রকৃতপক্ষে কোনও কোড যা বস্তুটি উপভোগ করবে তা যাচাই করে নেবে। null / ডিফল্ট বনাম "উপস্থিত না" এর মধ্যে কখনও কখনও পার্থক্য আছে ভুলবেন না।

নাল অবজেক্ট প্যাটার্ন পরীক্ষা করে দেখুন - কখনও কখনও এটি অ্যারের পরিবর্তে অ্যারের পরিবর্তে কিছু বিশেষ বস্তু পাস করতে পারে (অর্থাত্ [] অ্যারে বা স্ট্রিংগুলির জন্য null )।


আমি যে বিশেষ কী জন্য কোন মান আছে দেখাতে null ব্যবহার করবে। উদাহরণস্বরূপ, "আপনার পরিবারের ডিভাইসগুলির সংখ্যা ইন্টারনেটের সাথে সংযুক্ত হওয়ার" প্রতিনিধিত্ব করার জন্য নিল ব্যবহার করুন।

অন্য দিকে, {} যে বিশেষ কী প্রযোজ্য নয় তা ব্যবহার করুন। উদাহরণস্বরূপ, কোনও কারও মালিক না এমন ব্যক্তির কাছে, "সক্রিয় ইন্টারনেট সংযোগযুক্ত গাড়িগুলির সংখ্যা" প্রশ্নে, যদি null থাকে তবে আপনাকে গণনা দেখাতে হবে না।

আমি ডিফল্ট করে তোলে যেহেতু কোনো মান ডিফল্ট এড়াতে হবে। আপনি কোন মান প্রতিনিধিত্ব করতে null ব্যবহার করার সিদ্ধান্ত নিতে পারেন, যদিও, অবশ্যই এটি করার জন্য "null" ব্যবহার করবেন না।


এর প্রতিটি বিশ্লেষণ মূল্যায়ন করা যাক:

http://jsfiddle.net/brandonscript/Y2dGv/

var json1 = '{}';
var json2 = '{"myCount": null}';
var json3 = '{"myCount": 0}';
var json4 = '{"myString": ""}';
var json5 = '{"myString": "null"}';
var json6 = '{"myArray": []}';

console.log(JSON.parse(json1)); // {}
console.log(JSON.parse(json2)); // {myCount: null}
console.log(JSON.parse(json3)); // {myCount: 0}
console.log(JSON.parse(json4)); // {myString: ""}
console.log(JSON.parse(json5)); // {myString: "null"}
console.log(JSON.parse(json6)); // {myArray: []}

টিএল; এখানে ডাঃ

JSON2 JSON স্পেক প্রতিনিধিত্ব করে উপায় হল null প্রতিনিধিত্ব করা উচিত। কিন্তু সর্বদা হিসাবে, এটি আপনি যা করছেন তার উপর নির্ভর করে - কখনও কখনও এটি করার "সঠিক" উপায় সবসময় আপনার পরিস্থিতির জন্য কাজ করে না। আপনার রায় ব্যবহার করুন এবং একটি অবহিত সিদ্ধান্ত।

JSON1 {}

এটি একটি খালি বস্তু ফেরত দেয়। সেখানে কোন ডেটা নেই, এবং এটি কেবল আপনাকে বলতে যাচ্ছে যে আপনি যা খুঁজছেন তা কী (এটি আমার myCount বা অন্য কিছু হতে পারে) undefined ধরনের।

JSON2 {"myCount": null}

এই ক্ষেত্রে, myCount আসলে সংজ্ঞায়িত করা হয়, যদিও তার মানটি myCount । এটি " undefined নয় এবং null নয়" উভয়ের মতো নয়, এবং আপনি যদি এক অবস্থায় বা অন্যটির জন্য পরীক্ষিত হন তবে JSON1 ব্যর্থ হলে এটি সফল হতে পারে।

JSON spec প্রতি নিল প্রতিনিধিত্ব করার জন্য এই নির্দিষ্ট উপায়।

JSON3 {"myCount": 0}

এই ক্ষেত্রে, MyCount 0। এটি নিল হিসাবে একই নয়, এবং এটি false হিসাবে একই নয়। যদি আপনার শর্তাধীন বিবৃতি myCount > 0 মূল্যায়ন করে তবে এটি কার্যকর হতে পারে। তাছাড়া, যদি আপনি এখানে মূল্যের উপর ভিত্তি করে গণনা চালাচ্ছেন, 0 টি কার্যকর হতে পারে। আপনি যদি null জন্য পরীক্ষা করার চেষ্টা করছেন তবে, এই আসলে কাজ করতে যাচ্ছে না।

JSON4 {"myString": ""}

এই ক্ষেত্রে, আপনি একটি খালি স্ট্রিং পাচ্ছেন। আবার, JSON2 হিসাবে, এটি সংজ্ঞায়িত করা হয়েছে, কিন্তু এটি খালি। আপনি if (obj.myString == "") জন্য পরীক্ষা করতে পারেন তবে আপনি if (obj.myString == "") বা undefined জন্য পরীক্ষা করতে পারছেন না।

JSON5 {"myString": "null"}

এটি সম্ভবত আপনার সমস্যার সম্মুখীন হতে যাচ্ছে, কারণ আপনি স্ট্রিং মানটি নিলতে সেট করছেন; এই ক্ষেত্রে, obj.myString == "null" তবে এটি == null

JSON6 {"myArray": []}

এটি আপনাকে বলে দেবে যে আপনার অ্যারে myArray বিদ্যমান, কিন্তু এটি খালি। যদি আপনি myArray গণনা বা মূল্যায়ন করার চেষ্টা করছেন তবে এটি কার্যকর। উদাহরণস্বরূপ, আপনি একটি ব্যবহারকারী পোস্ট করা ফটো সংখ্যা মূল্যায়ন করতে চেয়েছিলেন - আপনি myArray.length করতে পারে এবং এটি 0 ফিরে হবে: সংজ্ঞায়িত, কিন্তু কোন ছবি পোস্ট।


JSON spec অনুযায়ী , বহির্বিশ্বের কন্টেইনারের উপরে কোনও মন্তব্য (বা 'অবজেক্ট') থাকা উচিত নয় যা উপরে উল্লেখিত বেশিরভাগ মন্তব্যগুলিতে অন্তর্ভূক্ত। এটি একটি তালিকা বা একটি ন্যূনতম মান হতে পারে (যেমন স্ট্রিং, সংখ্যা, বুলিয়ান বা নাল)। আপনি যদি JSON এর একটি নিল মান প্রতিনিধিত্ব করতে চান তবে সমগ্র JSON স্ট্রিং (JSON স্ট্রিং সহ উদ্ধৃতি বাদে) কেবল null । কোন ধনুর্বন্ধনী, কোন বন্ধনী, কোন উদ্ধৃতি। আপনি একটি শূন্য মান ( {"key1":null} ) সহ একটি কী ধারণকারী একটি অভিধান নির্দিষ্ট করতে পারেন, বা একটি {"key1":null} মান ( [null] ) সহ একটি তালিকা, তবে {"key1":null} নল মান নয় - এটি সঠিক অভিধান এবং তালিকা। একইভাবে, একটি খালি অভিধান ( {} ) বা একটি খালি তালিকা ( [] ) পুরোপুরি জরিমানা, তবে এটি নল নয়।

পাইথন ইন:

>>> print json.loads('{"key1":null}')
{u'key1': None}
>>> print json.loads('[null]')
[None]
>>> print json.loads('[]')
[]
>>> print json.loads('{}')
{}
>>> print json.loads('null')
None

null শূন্য নয়। এটি একটি মান নয়, প্রতি : এটি ভেরিয়েবলের ডোমেনের বাইরে একটি মান যা অনুপস্থিত বা অজানা তথ্য নির্দেশ করে।

JSON এ নিল প্রতিনিধিত্ব করার একমাত্র উপায় রয়েছে। চশমা প্রতি ( RFC 4627 এবং json.org ):

2.1.  Values

A JSON value MUST be an object, array, number, or string, or one of
the following three literal names:

  false null true





gson