"প্রত্যাশিত BEGIN_OBJECT কিন্তু 1 টি 1 কলামের লাইনে ছিল"


126

আমার এই পদ্ধতিটি রয়েছে:

public static Object parseStringToObject(String json) {
    String Object = json;
    Gson gson = new Gson();
    Object objects = gson.fromJson(object, Object.class);
    parseConfigFromObjectToString(object);
    return objects;
}

এবং আমি এর সাথে একটি জেএসএনকে বিশ্লেষণ করতে চাই:

public static void addObject(String IP, Object addObject) {
    try {
        String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));
        addObject = ConfigJSONParser.parseStringToObject(json);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

তবে আমি একটি ত্রুটি বার্তা পেয়েছি:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: প্রত্যাশিত BEGIN_OBJECT তবে লাইন 1 কলাম 1 এ ছিল STRING


2
আপনার পোস্টের অনুরোধের মাধ্যমে জেএসএন স্ট্রিংটি পোস্ট করুন।
অ্যাড্রিয়ান লিওনহার্ড

আপনার JSON স্ট্রিং পোস্ট করুন
bhspencer

উত্তর:


163

এমনকি আপনার জেএসএন স্ট্রিংটি না দেখে আপনি ত্রুটি বার্তা থেকে বলতে পারেন যে এটি আপনার শ্রেণীর উদাহরণে পার্স করা সঠিক কাঠামো নয়।

গসন আশা করছে যে আপনার জেএসওএন স্ট্রিংটি কোনও অবজেক্ট খোলার বন্ধনী দিয়ে শুরু হবে। যেমন

{

তবে আপনি যে স্ট্রিংটি দিয়ে গেছেন তা খোলার উদ্ধৃতি দিয়ে শুরু হয়

"

1
এবং পদ্ধতির খুব নাম কেন তা বোঝায়। parseStringToObjectপরামর্শ দেয় যে এটি একটি JSON অবজেক্ট প্রত্যাশা করে, যা সর্বদা শুরু হয় {
ysavit

12
'[' একটি জসন অ্যারের শুরু জাসন অবজেক্টকে নির্দেশ করবে।
bhspencer

আমি জানতাম .. তবে পার্স করার জন্য আমাদের কী করতে হবে ??
অজয় মিস্ত্রি

@ অজয়মিস্ট্রি আপনি বিস্তারিত জিজ্ঞাসা না করে কী জিজ্ঞাসা করছেন তা পরিষ্কার নয়। আমি আপনাকে যে JSON পার্স করার চেষ্টা করছেন তার একটি উদাহরণ সহ একটি নতুন প্রশ্নে আপনার নির্দিষ্ট সমস্যা পোস্ট করার পরামর্শ দিচ্ছি।
bhspencer

1
প্রিয় @bhspencer আমি অ্যানড্রইড APK মধ্যে রেট্রোফিট ব্যবহার করছি মত সরল JSON পেতে {"ip":"192.167.1.15"}থেকে Restful EJB web service with jboss EAP 7.1ব্যাকএন্ড হবে। তবে আমি "প্রত্যাশিত BEGIN_OBJECT পেয়েছি তবে 1 টি 1 কলামে STRING ছিল" দয়া করে আমাকে সহায়তা করুন ... এটি আমার ওয়েব পরিষেবা: @ স্টেটলেস @ পেথ ("/ getflashcard") পাবলিক ক্লাস গেটফ্ল্যাশকার্ড {@ ইন্টারসেপ্টার (ভ্যালিডেটর.ক্লাস) @ জিইটি @ প্রোডাক্টস (মিডিয়াটাইপ.এপিপিএলসিকেশন_জেএসএন) পাবলিক স্ট্রিং গেটফ্ল্যাশকার্ড () ring স্ট্রিং জসনস্ট্রিং = নতুন জেএসএনওবজেক্ট ()। পুট ("আইপি", "192.167.1.15")। টু স্ট্রিং (); রিটার্ন জসনস্ট্রিং; ।}
হোসেইন আকাশানী

17

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

এই সমস্ত বিষয় মাথায় রেখে ক্লায়েন্টের পক্ষে সঠিক ফিক্সটি

try
{
  gson.fromJSON(ad, Ad.class);
  //...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
  //...

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

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

আপনি যদি আবার চেষ্টা করতে যাচ্ছেন তবে আমি চেষ্টা করব / ক্যাচ ব্লকের ভিতরে একটি পতাকা সেট করা এবং তারপরে ট্র্যাচ / ক্যাচ ব্লকের বাইরে পতাকাটির প্রতিক্রিয়া জানাতে highly নেস্টেড ট্রাই / ক্যাচ সম্ভবত গনসন আমাদের স্ট্যাক ট্রেস এবং ব্যতিক্রম মিলে না যায় তা দিয়ে কীভাবে আমাদের এই গোলযোগের মধ্যে ফেললেন।

অন্য কথায়, যদিও আমি স্বীকার করি এটি খুব মার্জিত দেখাচ্ছে না তবে আমি সুপারিশ করব

boolean failed = false;

try
{
  gson.fromJSON(ad, Ad.class);
  //...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
  failed = true;
  //...
}

if (failed)
{
  //...

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

5

রেট্রোফিট 2-এ, আপনি যখন পরামিতিগুলি কাঁচাতে প্রেরণ করতে চান তখন আপনাকে অবশ্যই স্কেলার ব্যবহার করতে হবে।

প্রথমে এটি আপনার গ্রেডে যুক্ত করুন:

    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'com.squareup.retrofit2:converter-scalars:2.3.0'

    public interface ApiInterface {

    String URL_BASE = "http://10.157.102.22/rest/";

    @Headers("Content-Type: application/json")
    @POST("login")
    Call<User> getUser(@Body String body);

}

আমার নমুনা কার্যকলাপ:

   public class SampleActivity extends AppCompatActivity implements Callback<User> {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(ApiInterface.URL_BASE)
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        ApiInterface apiInterface = retrofit.create(ApiInterface.class);


        // prepare call in Retrofit 2.0
        try {
            JSONObject paramObject = new JSONObject();
            paramObject.put("email", "sample@gmail.com");
            paramObject.put("pass", "4384984938943");

            Call<User> userCall = apiInterface.getUser(paramObject.toString());
            userCall.enqueue(this);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }


    @Override
    public void onResponse(Call<User> call, Response<User> response) {
    }

    @Override
    public void onFailure(Call<User> call, Throwable t) {
    }
}

রেফারেন্স: [ কীভাবে একটি retrofit অনুরোধের মূল অংশে পুরো JSON পোস্ট করা যায়?


3

হতে পারে আপনার JSON Objectঠিক আছে, তবে আপনি যে প্রতিক্রিয়া পেয়েছেন তা আপনার বৈধ ডেটা নয় J আপনি যখন অবৈধটিকে সংযুক্ত করেন ঠিক তেমনই WiFiআপনি একটি অদ্ভুত প্রতিক্রিয়া পেতে পারেন < html>.....< /html>যা GSONপার্স করতে পারে না।

try..catch..ক্রাশ এড়াতে আপনার এই অদ্ভুত প্রতিক্রিয়ার জন্য কিছু করার প্রয়োজন হতে পারে।


3

আমি একটি সমাধান ভাগ করে নিতে এসেছি। নোটবুকটি হ্যাং আপ করতে বাধ্য করার পরে ত্রুটি ঘটেছিল। সম্ভাব্য সমাধান clean preject


3

আপনার কাছে ডেট / ডেটটাইম ইত্যাদির মতো ডিজাইনালাইজড অবজেক্ট রয়েছে তা নিশ্চিত করুন আপনি যদি সরাসরি জেএসওনকে ডিসরিয়ালাইজড না করে প্রেরণ করছেন তবে এটি এই সমস্যার কারণ হতে পারে।


প্রেরণের আগে সিরিয়াস?
ratzip

@ratzip দুঃখিত, আমি বোঝাতে চাইছিলাম আমাদের তারিখের মতো বিষয়গুলির জন্য একটি ডিসিরিয়ালাইজার (যুক্তি) যুক্ত করা উচিত তারিখ সময়. আমি যখন JAVA অবজেক্টে একটি JsonObject মানচিত্র করতে চেয়েছিলাম তখন আমি এই সমস্যার মুখোমুখি হয়েছি।
রবি ওয়াডজে

3

আমার পরিস্থিতিতে আমার একটি "মডেল" রয়েছে, একটি বাদে বেশ কয়েকটি স্ট্রিং প্যারামিটার থাকে: এটি বাইট অ্যারে byte[]। কিছু কোড স্নিপেট:

String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);

উপরের শেষ লাইনটি যখন

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column

আলোড়ন সৃষ্টি হয়. এসও এর মাধ্যমে অনুসন্ধান করে, আমি বুঝতে পেরেছিলাম যে Adapterআমার BaseModelকাছে জেসনঅবজেক্টে রূপান্তর করতে আমার কিছু ফর্ম থাকা দরকার। একটি মডেল মিশ্রিত করা Stringএবং byte[]জিনিস জটিল করে তোলে। দৃশ্যত,Gson পরিস্থিতিটি আসলে পছন্দ করবেন না।

আমি ফর্ম্যাটে রূপান্তরিত হয় Adapterতা নিশ্চিত করার জন্য একটি তৈরি শেষ করি । এখানে আমার ক্লাস:byte[]Base64Adapter

public class ByteArrayToBase64Adapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> {

    @Override
    public byte[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return Base64.decode(json.getAsString(), Base64.NO_WRAP);
    }

    @Override
    public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(Base64.encodeToString(src, Base64.NO_WRAP));
    }
}

জেএসএনওজেক্টকে মডেলে রূপান্তর করতে, আমি নিম্নলিখিতটি ব্যবহার করেছি:

Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);

একইভাবে, মডেলটিকে JSONObject এ রূপান্তর করতে, আমি নিম্নলিখিতটি ব্যবহার করেছি:

Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);

কোডটি যা করছে তা মূলত যখনই / জেএসওএনজেক্টে রূপান্তরকালে মুখোমুখি হয় তখনই উদ্দেশ্যযুক্ত class/object(এই ক্ষেত্রে, byte[]শ্রেণি) মাধ্যমে Adapterচাপ দেওয়া।



0

আমার ক্ষেত্রে, আমি JSON অবজেক্ট হিসাবে ফিরিয়ে দিচ্ছি

data "ডেটা": "", "বার্তা": "উপস্থিতি সফলভাবে সংরক্ষণ করা হয়েছে .. !!!", "স্থিতি": "সাফল্য"}

এটি হিসাবে পরিবর্তন করে সমাধান করা হয়েছে

data "ডেটা": {}, "বার্তা": "উপস্থিতি সফলভাবে সংরক্ষণ করা হয়েছে .. !!!", "স্থিতি": "সাফল্য"}

এখানে ডেটা একটি সাব জসনঅবজেক্ট এবং এটি "" নয় "থেকে শুরু হওয়া উচিত


0

যদি আপনার জসন ফর্ম্যাট এবং ভেরিয়েবলগুলি ঠিক থাকে তবে আপনার ডাটাবেস প্রশ্নগুলি পরীক্ষা করুন ... ডিবায় সঠিকভাবে ডেটা সংরক্ষণ করা হলেও আসল সমস্যাটি সেখানে থাকতে পারে ... আপনার অনুসন্ধানগুলি পুনরায় পরীক্ষা করুন এবং আবার চেষ্টা করুন ... আশা করি এটি সহায়তা করে


0

প্রথমে জিসন () ব্যবহার করে আপনার বস্তুকে জসনে রূপান্তর করতে ভুলবেন না

  val fromUserJson = Gson().toJson(notificationRequest.fromUser)

তারপরে আপনি এই দুর্দান্ত লাইব্রেরিটি ব্যবহার করে সহজেই এটিকে আবার কোনও বস্তুতে রূপান্তর করতে পারেন

      val fromUser = Gson().fromJson(fromUserJson, User::class.java)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.