সিনট্যাক্স এরির: জেএসএনে অপ্রত্যাশিত টোকেন ও position পজিশনে


138

আমি আমার কন্ট্রোলারে একটি টাইপ শ্রেণি ব্যবহার করে কয়েকটি ডেটা পার্স করছি যা আমি নিম্নলিখিতভাবে ডেটা পাচ্ছি:

{  
   "data":{  
      "userList":[  
         {  
            "id":1,
            "name":"soni"
         }
      ]
   },
   "status":200,
   "config":{  
      "method":"POST",
      "transformRequest":[  
         null
      ],
      "transformResponse":[  
         null
      ],
      "url":"/home/main/module/userlist",
      "headers":{  
         "rt":"ajax",
         "Tenant":"Id:null",
         "Access-Handler":"Authorization:null",
         "Accept":"application/json, text/plain, */*"
      }
   },
   "statusText":"OK"
}

আমি এই মত ডেটা সংরক্ষণ করার চেষ্টা করেছি

var userData = _data;
var newData = JSON.parse(userData).data.userList;

আমি কীভাবে একটি নতুন ভেরিয়েবলের ব্যবহারকারীর তালিকাটি বের করতে পারি?


11
আপনার ব্যবহারের দরকার নেই JSON.parseuserDataঅবজেক্ট হিসাবে সরাসরি ব্যবহার করার চেষ্টা করুন ।
মোহিত ভরদ্বাজ

13
যদি console.log(typeof userData)দেখায় objectতবে আপনার কাছে ইতিমধ্যে একটি জাভাস্ক্রিপ্ট অবজেক্ট রয়েছে এবং জেএসএন স্ট্রিং নেই যা আপনাকে বিশ্লেষণ করতে হবে।
t.niese

1
@ মোহিত ভরদ্বাজ হ্যাঁ, পার্সের দরকার নেই ..
সোনিয়া মোহন

5
সাধারণত যখনই আপনি এই ত্রুটিটি পান - Unexpected token o in JSONসম্ভবত, আপনি ইতিমধ্যে পার্সড আকারে থাকা কোনও বস্তুর বিশ্লেষণের চেষ্টা করছেন।
মোহিত ভরদ্বাজ

@ মোহিত ভরদ্বাজ ঠিক আছে!
সোনিয়া মোহন

উত্তর:


190

আপনার পোস্ট করা JSON দেখতে আপনার দৃষ্টিকোণে দুর্দান্ত দেখাচ্ছে তবে সম্ভবত এটি আর কোনও JSON স্ট্রিং নয় তবে ইতিমধ্যে একটি জাভাস্ক্রিপ্ট অবজেক্ট। এর অর্থ, আর কোনও পার্সিংয়ের প্রয়োজন নেই।

আপনি নিজে এটি পরীক্ষা করতে পারেন, যেমন ক্রোমের কনসোলে:

new Object().toString()
// "[object Object]"

JSON.parse(new Object())
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse("[object Object]")
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse()ইনপুটটিকে স্ট্রিংয়ে রূপান্তর করে। toString()জাভাস্ক্রিপ্ট পদ্ধতি ডিফল্ট আয় বিষয়বস্তুসমূহের [object Object], পর্যবেক্ষিত আচরণের ফলে।

পরিবর্তে নিম্নলিখিত চেষ্টা করুন:

var newData = userData.data.userList;

1
সুতরাং এটি কি সমস্ত ধরণের ব্রাউজারের জন্য প্রযোজ্য?
comeOnGetIt

@ টিমো আপনি এই লিঙ্কটি দেখতে পারেন?
ভি এসএইচ

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

65

ফাংশনের প্রথম প্যারামিটারগুলি JSON.parseএকটি স্ট্রিং হওয়া উচিত এবং আপনার ডেটা একটি জাভাস্ক্রিপ্ট অবজেক্ট, সুতরাং এটি স্ট্রিংয়ে রূপান্তরিত হবে [object object], আপনাকে JSON.stringifyডেটা পাস করার আগে ব্যবহার করা উচিত

JSON.parse(JSON.stringify(userData))

1
দুর্দান্ত সাহায্য করেছেন ভাই। ধন্যবাদ :)
আনন্দ_5050

এটি সহায়তা করেছে solution সমাধানের জন্য ধন্যবাদ।
নাগ অর্জুন

আপনি আমার দিন বাঁচা। ধন্যবাদ :)
দ্বারকেশ সনি

যখন স্ট্রিংটিতে একটি ডাবল উদ্ধৃতি রয়েছে তখন আপনার কোনও সমাধান রয়েছে
মিঃ এস কোডার

23

JSON.parseএটিকে try-catchব্লক মোড়ানো ছাড়া কখনও ব্যবহার করবেন না :

// payload 
let userData = null;

try {
    userDate = JSON.parse(payload); 
} catch (e) {
    // You can read e for more info
    // Let's assume the error is that we already have parsed the payload
    // So just return that
    userData = payload;
}

// Now userData is the parsed result

7
এটি আসলে প্রশ্নের উত্তর দেয় না, তবে ব্যতিক্রম হ্যান্ডলিংয়ের অভাব সম্পর্কে মন্তব্য করে।
রিচার্ড ডুয়ার

2
@ রিচার্ডডুয়ার, তবে এটি প্রধান বিষয়ের ত্রুটি ঠিক করতে সহায়তা করবে। অর্থাত্ত সিনট্যাক্স এরর: জেএসএন-তে অপ্রত্যাশিত টোকেন ও পজিশনে 1
নিকো জোজো

6
এটি কেবল ত্রুটিটি আড়াল করে, তবে আসলে এটি সমাধান করে না।
রিচার্ড ডিউর

21

ঠিক উপরে JSON.parse, ব্যবহার করুন:

var newData = JSON.stringify(userData)

4
JSON.stringify()একটি জাভাস্ক্রিপ্ট অবজেক্টকে এর স্ট্রিং প্রতিনিধিতে রূপান্তরিত করে, যা এটির বিপরীত JSON.parse()। আপনি পেয়ে SyntaxErrorযাচ্ছিলেন কারণ আপনি এমন কিছু বিশ্লেষণ করার চেষ্টা করছেন যা ইতিমধ্যে একটি অবজেক্ট। @ সুখচাইনের সমাধানে এটি এড়ানোর জন্য এটি স্ট্রিংয়ে রূপান্তরিত হয়।
হুবার্ট

1
এর খারাপ দিকটি হ'ল শেষ পর্যন্ত আপনি JSON.parse()খুব বেশি রিন্ডন্ড্যান্ট ব্যবহার করছেন । এটি একটি দুর্দান্ত দ্রুত প্রক্রিয়া সত্ত্বেও, JSON পার্সিং সিঙ্ক্রোনসিভভাবে সম্পন্ন হয়েছে এবং সম্ভবত আপনার ইউআই অবরুদ্ধ করতে পারে, তাই আমি এটি ব্যবহারের বিরুদ্ধে পরামর্শ দেব। পরিবর্তে, আপনি পরীক্ষা করতে পারেন যে আপনার ভেরিয়েবলটি কোনও বস্তু কিনা, উদাহরণস্বরূপ typeof(userData) === 'object'এটির বিশ্লেষণ করার চেষ্টা করার আগে ব্যবহার করা।
হুবার্ট

2

আচ্ছা, আমি বোঝানো যে আমি এই মত বস্তু বিশ্লেষণ করা প্রয়োজন: var jsonObj = {"first name" : "fname"}। কিন্তু, আমি আসলে না। কারণ এটি ইতিমধ্যে একটি জেএসএন।


2

আমরা এর মতো চেক যোগ করতে পারি:

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}

1

যখন JSON ডেটা বা স্ট্রিংকে বিশ্লেষণের ঘটনা ঘটে তখন অপ্রত্যাশিত 'O' ত্রুটি নিক্ষেপ করা হয়।

যদি এটি স্ট্রিং হয় তবে এটি ইতিমধ্যে স্ট্রিংফাইড। অপ্রত্যাশিত 'ও' ত্রুটির সাথে পার্সিং শেষ হয়।

আমি একইরকম মুখোমুখি হয়েছি (যদিও বিভিন্ন প্রসঙ্গে), আমি JSON প্রযোজককে অপসারণ করে নিম্নলিখিত ত্রুটিটি সমাধান করেছি।

    @POST
    @Produces({ **MediaType.APPLICATION_JSON**})
    public Response login(@QueryParam("agentID") String agentID , Officer aOffcr ) {
      return Response.status(200).entity("OK").build();

  }

প্রতিক্রিয়াটিতে "ঠিক আছে" স্ট্রিং রিটার্ন রয়েছে। টীকাটি @ পণ্য হিসাবে চিহ্নিত হয়েছে ({** মিডিয়াটাইপ.এপিপিএলিকেশন_জেএসএন }) ** স্ট্রিংটিকে JSON ফর্ম্যাটে পার্স করার চেষ্টা করেছে যার ফলস্বরূপ অপ্রত্যাশিত 'ও'

@ পণ্যগুলি সরানো ({ MediaType.APPLICATION_JSON }) ভাল কাজ করে। আউটপুট: ঠিক আছে

সাবধানতা: এছাড়াও, ক্লায়েন্টের পক্ষ থেকে, আপনি যদি এজাক্স অনুরোধ করেন এবং JSON.parse ("ঠিক আছে") ব্যবহার করেন, এটি অপ্রত্যাশিত টোকেন 'ও' ফেলে দেয়

হে স্ট্রিংয়ের প্রথম অক্ষর

JSON.parse (অবজেক্ট) jQuery.parseJSON (অবজেক্ট) এর সাথে তুলনা করে;

JSON.parse ('{"নাম": "ইয়ারগ্লেম", "শহর": "ডোভার"}'); --- ঠিকভাবে কাজ করে

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