জেএসনে নাল প্রতিনিধিত্ব করছেন


422

জেএসএনে নাল মানগুলি ফেরত দেওয়ার জন্য পছন্দসই পদ্ধতিটি কী? আদিমদের জন্য আলাদা পছন্দ আছে কি?

উদাহরণস্বরূপ, সার্ভারে যদি আমার অবজেক্টটির কোনও মান না দিয়ে "মাইকাউন্ট" নামে একটি পূর্ণসংখ্যা থাকে তবে সেই মানটির জন্য সবচেয়ে সঠিক জেএসএন হ'ল:

{}

অথবা

{
    "myCount": null
}

অথবা

{
    "myCount": 0
}

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

{}

অথবা

{
    "myString": null
}

অথবা

{
    "myString": ""
}

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

{
    "myString": "null"
}

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

একটি খালি অ্যারে উপস্থাপন করা হবে:

{
    "myArray": []
}

সম্পাদনা সংক্ষিপ্তসার

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

  • বস্তুগুলি আদিমতার চেয়ে বেশি পছন্দ করা হয়।
  • শূন্য সংগ্রহগুলি শূন্যের চেয়ে বেশি পছন্দ করা হয়।
  • কোনও মান ছাড়াই অবজেক্টগুলি নাল হিসাবে প্রতিনিধিত্ব করা হয়।
  • আদিমরা তাদের মূল্য ফিরিয়ে দেয়।

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

{

    "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

}

উপরের জেএসএনটি নিম্নলিখিত জাভা ক্লাস থেকে উত্পন্ন হয়েছিল।

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>

5
সবচেয়ে ভাল উপায় নেই। আপনার কংক্রিট ব্যবহারের ক্ষেত্রে ক্লায়েন্টের পক্ষে সবচেয়ে সহজ ব্যবহার কী তা চয়ন করুন। পরিবর্তে খালি সংগ্রহগুলি ফিরিয়ে দেওয়ার প্রবণতায় null, বিবেচনা করুন যে আপনার ক্লায়েন্ট খালি স্ট্রিংয়ের সাথে আরও ভাল কিনা বা null- "নাল" শব্দযুক্ত একটি স্ট্রিং একটি বৈধ মান থেকে পৃথক নয়, এটি করবেন না।
ফিলিপ রেচার্ট

3
0 বা একটি খালি স্ট্রিংয়ের নাল থেকে খুব ভাল অর্থ হতে পারে, যা বিদ্যমান নয় এমন বৈশিষ্ট্য থেকে আলাদা অর্থ হতে পারে। আপনি যদি নালকে উপস্থাপন করতে চান তবে নাল ব্যবহার করুন। এটি সবচেয়ে স্পষ্ট।
জন শিহান

অবজেক্টিভ-সিতে একটি সংজ্ঞায়িত NSNullশ্রেণি রয়েছে যার একটি সিঙ্গলটন উদাহরণ রয়েছে। এই দৃষ্টান্তের একটি উল্লেখটি JSON এর সমতুল্য null। আমি অনুমান করব যে অন্য কোনও ভাষা একই কাজ করতে পারে। অবশ্যই, অনুমিত শ্রেণিতে কাস্টিংয়ের আগে একজনকে প্রাপ্ত বস্তুর শ্রেণি পরীক্ষা করতে হবে - যেমনটি ছিল "নাল সচেতন" হতে হবে।
হট লিকস

2
নোট করুন যে "নাল" তালিকাটি জাভাতে সর্বোত্তম অনুশীলন নয়: যদি তালিকাটি ফাঁকা প্রত্যাশিত হয়, তবে খালি তালিকায় এটি সূচনা করুন। এটি প্রয়োজন হলে থাকা খালি (যেমন, কারণ এটি বদলে একটি নতুন তালিকা দ্বারা পাইকারি প্রতিস্থাপিত হবে মানগুলি যোগ করতে রুপান্তরিত), এটা ইনিশিয়ালাইজ খালি তালিকা (অর্থাত )। এটি করলে নাল রেফারেন্স বাগগুলি এড়ানো যায় যা অন্যথায় ব্যথা হতে পারে। Collections.emptyList()
পেরিটা ব্রেটাটা

@ হটলিক্স - এটি কেবলমাত্র সম্ভব কারণ কারণ উদ্দেশ্য-সি ডায়নামিকভাবে টাইপ করা হয়েছে। জাভাতে, উদাহরণস্বরূপ, আপনার একটি (দরকারী) Nullশ্রেণি থাকতে পারে না কারণ আপনি কেবল তার নিজস্ব ধরণের বা ধরণের অবজেক্টগুলিতে এর মান নির্ধারণ করতে সক্ষম হবেন Object
পেরিটা ব্রেটাটা

উত্তর:


378

আসুন প্রত্যেকের বিশ্লেষণ মূল্যায়ন করুন:

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: []}

TL; ড এখানে:

মধ্যে টুকরা json2 পরিবর্তনশীল উপায় তাদেরকে JSON বৈশিষ্ট ইঙ্গিত nullপ্রতিনিধিত্ব করতে হবে। তবে সর্বদা হিসাবে, এটি আপনি যা করছেন তার উপর নির্ভর করে - কখনও কখনও এটি করার "সঠিক" উপায়টি সর্বদা আপনার পরিস্থিতির জন্য কাজ করে না। আপনার রায় ব্যবহার করুন এবং একটি অবগত সিদ্ধান্ত নিন।


JSON1 {}

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


JSON2 {"myCount": null}

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

এটি JSON স্পেসnull অনুযায়ী প্রতিনিধিত্ব করার চূড়ান্ত উপায় ।


JSON3 {"myCount": 0}

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


JSON4 {"myString": ""}

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


JSON5 {"myString": "null"}

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


JSON6 {"myArray": []}

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


1
অনেক অনেক ধন্যবাদ। কেবল একটি ছোট পাশের নোড; যখন খেলার JSON (Scala) অপশন সিরিয়েলাইজ [স্ট্রিং] = কোনটি ফল JSON1অর্থাত{}
নিল

207

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

nullজেএসএনে প্রতিনিধিত্ব করার একমাত্র উপায় is স্পেস প্রতি ( আরএফসি 4627 এবং json.org ):

2.1। মানগুলি

একটি JSON মান একটি অবজেক্ট, অ্যারে, সংখ্যা, বা স্ট্রিং বা একটি হতে হবে
নিম্নলিখিত তিনটি আক্ষরিক নাম:

  মিথ্যা নাল সত্য

এখানে চিত্র বর্ণনা লিখুন


8
এটি এমন লজ্জাজনক যে নালকে একেবারে উপস্থিত থাকতে হবে। কিছুই জন্য 4 অক্ষর। মানটি পুরোপুরি বাদ দিয়ে দিলে ভাল লাগত। json = '{"myValue":}';
রিচার্ড এ চতুর্মুখী

119
@ রিচার্ড এ কোয়াডলিং - আমি হাল আবেলসনের "প্রোগ্রাম অবশ্যই লোকদের পড়ার জন্য এবং শুধুমাত্র ঘটনাক্রমে মেশিনগুলি কার্যকর করতে" এর অনুগামী। আমি প্রোগ্রামারটির অভিপ্রায়টিকে নিশ্চিত করে 'নাল' শব্দটি পছন্দ করতাম, এবং কেবল দুর্ঘটনাজনিত বাদ পড়ার প্রশ্নই নয়।
স্কট স্মিথ

13
@ ডেভ মে: "জেএসএন মানগুলি প্রোগ্রাম নয়" - আমার বক্তব্যটি দ্ব্যর্থহীন উপায়ে সিগন্যাল ইন্টেন্ট সম্পর্কে। হ্যাঁ, এটি অতিরিক্ত চারটি অক্ষর ব্যয় করে এবং কিছু অ্যাপ্লিকেশনের জন্য পার্থক্যটি উল্লেখযোগ্য হতে পারে। যদিও বেশিরভাগ ক্ষেত্রে ত্রুটিগুলি করার সুবিধাটি ভুল দেখায় না কেন এটি অপেক্ষাকৃত ছোট্ট অপ্টিমাইজেশনের সুবিধা।
স্কট স্মিথ

11
@ ডেভ এছাড়াও, json.org এর মতে, JSON "মানুষের পক্ষে পড়া এবং লেখা সহজ"।
সোফিভাইরাস

14
আরও মনে রাখবেন যে আপনার যদি 4 এসসিআইআই অক্ষর নিয়ে সমস্যা থাকে তবে জেএসওএন সেরা পদ্ধতির নয়, বাইনারি জেএসএন বা আরও খাঁটি বাইনারি ফর্ম্যাটে আরও ভালভাবে দেখুন।
ফোনিক্স

26

প্রতিনিধিত্ব করার একমাত্র উপায় আছে null; যে সাথে হয় null

console.log(null === null);   // true
console.log(null === true);   // false
console.log(null === false);  // false
console.log(null === 'null'); // false
console.log(null === "null"); // false
console.log(null === "");     // false
console.log(null === []);     // false
console.log(null === 0);      // false

ঐটাই বলতে হবে; আপনার JSON উপস্থাপনা গ্রাহক ক্লায়েন্টগুলির মধ্যে যদি কেউ ===অপারেটর ব্যবহার করে ; এটি তাদের জন্য সমস্যা হতে পারে।

মূল্যহীন

আপনি যদি তা জানাতে চান যে আপনার এমন একটি অবজেক্ট রয়েছে যার বৈশিষ্ট্যের myCountকোনও মূল্য নেই:

{ "myCount": null }

কোনও বৈশিষ্ট্য / অনুপস্থিত বৈশিষ্ট্য নেই

আপনি যদি কোনও কথা বলতে চান যে আপনার কোনও বৈশিষ্ট্য নেই:

{}

ক্লায়েন্ট কোড অ্যাক্সেস myCountএবং পাওয়ার চেষ্টা করবে undefined; এটা সেখানে নেই

খালি সংগ্রহ

আপনি যদি myCountএই কথাটি জানাতে চান যে আপনার একটি শূন্য তালিকার একটি অ্যাট্রিবিউট যুক্ত একটি বস্তু রয়েছে :

{ "myCount": [] }

তুলনা সহ +1 ভাল উদাহরণ, তবে জাভাস্ক্রিপ্ট এবং জসন এর মধ্যে পার্থক্য করা সহায়ক, অর্থাত্ জাভাস্ক্রিপ্টে নাল প্রতিনিধিত্ব করার জন্য জাসন এর মিল নেই (যদিও এটি আছে)।
ম্লাদেন বি

15

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

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

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


7

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

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


2

এটি ব্যক্তিগত এবং পরিস্থিতিগত পছন্দ। গুরুত্বপূর্ণ বিষয়টি মনে রাখবেন যে খালি স্ট্রিং এবং শূন্য সংখ্যাটি ধারণাগতভাবে পৃথক null

একটি ক্ষেত্রে countআপনি সম্ভবত সর্বদা কিছু বৈধ সংখ্যা চান (যদি না countএটি অজানা বা অপরিজ্ঞাত না হয়) তবে স্ট্রিংয়ের ক্ষেত্রে কে জানে? খালি স্ট্রিংটির অর্থ আপনার অ্যাপ্লিকেশনটির কিছু হতে পারে । অথবা হতে পারে না। এটা সিদ্ধান্ত নিতে আপনার উপর নির্ভর করে।


1

জেএসএন অনুমান অনুসারে , উপরের বেশিরভাগ মন্তব্যে অন্তর্নিহিত বাহ্যিক পাত্রে কোনও অভিধান (বা 'অবজেক্ট') হতে হবে না। এটি একটি তালিকা বা একটি খালি মান (যেমন স্ট্রিং, সংখ্যা, বুলিয়ান বা নাল) হতে পারে। আপনি যদি JSON এ নাল মান উপস্থাপন করতে চান তবে পুরো JSON স্ট্রিং (JSON স্ট্রিং সহ কোটগুলি বাদ দিয়ে) কেবল সহজ null। কোনও ধনুর্বন্ধনী, কোনও বন্ধনী, কোন উদ্ধৃতি নেই। আপনি নাল মান ( {"key1":null}), অথবা একটি নাল মান ( [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বৈধ জেএসওএন গঠন করে এমন দাবী যাচাই করে । প্রধান বডি টেক্সট এবং চিত্রগুলি অস্পষ্ট রয়েছে এবং যদি কিছু মনে হয় কেবলমাত্র অবজেক্ট এবং অ্যারেগুলি মূলে বৈধ।
yoyoyoyosef
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.