জ্যাকসন ব্যবহার করে জেএসএন স্ট্রিংকে প্রেটি প্রিন্ট জেএসএন আউটপুট রূপান্তর করুন


165

এটি আমার কাছে রয়েছে JSON স্ট্রিং:

{"attributes":[{"nm":"ACCOUNT","lv":[{"v":{"Id":null,"State":null},"vt":"java.util.Map","cn":1}],"vt":"java.util.Map","status":"SUCCESS","lmd":13585},{"nm":"PROFILE","lv":[{"v":{"Party":null,"Ads":null},"vt":"java.util.Map","cn":2}],"vt":"java.util.Map","status":"SUCCESS","lmd":41962}]}

আমাকে উপরের জেএসওনকে Stringনীচের মত সুন্দর প্রিন্ট জেএসএন আউটপুটে (জ্যাকসন ব্যবহার করে) রূপান্তর করতে হবে :

{
    "attributes": [
        {
            "nm": "ACCOUNT",
            "lv": [
                {
                    "v": {
                        "Id": null,
                        "State": null
                    },
                    "vt": "java.util.Map",
                    "cn": 1
                }
            ],
            "vt": "java.util.Map",
            "status": "SUCCESS",
            "lmd": 13585
        },
        {
            "nm": "PROFILE
            "lv": [
                {
                    "v": {
                        "Party": null,
                        "Ads": null
                    },
                    "vt": "java.util.Map",
                    "cn": 2
                }
            ],
            "vt": "java.util.Map",
            "status": "SUCCESS",
            "lmd": 41962
        }
    ]
}

উপরের আমার উদাহরণের উপর ভিত্তি করে কেউ আমাকে একটি উদাহরণ সরবরাহ করতে পারেন? কীভাবে এই পরিস্থিতি অর্জন করবেন? আমি জানি যে এখানে প্রচুর উদাহরণ রয়েছে তবে আমি সেগুলি সঠিকভাবে বুঝতে পারি না। কোনও সহায়তা একটি সাধারণ উদাহরণ দিয়ে প্রশংসা করা হবে।

আপডেট করা হয়েছে:

নীচের কোডগুলি আমি ব্যবহার করছি:

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonString));

তবে এটি উপরে উল্লিখিত হিসাবে আউটপুটটির যেভাবে প্রয়োজন তার সাথে কাজ করে না।

উপরের জেএসওএন-এর জন্য আমি যে পোজিও ব্যবহার করছি তা এখানে:

public class UrlInfo implements Serializable {

    private List<Attributes> attribute;

}

class Attributes {

    private String nm;
    private List<ValueList> lv;
    private String vt;
    private String status;
    private String lmd;

}


class ValueList {
    private String vt;
    private String cn;
    private List<String> v;
}

কেউ আমাকে বলতে পারেন যে আমি জেএসএনের জন্য সঠিক পোজো পেয়েছি কিনা?

আপডেট করা হয়েছে:

String result = restTemplate.getForObject(url.toString(), String.class);

ObjectMapper mapper = new ObjectMapper();
Object json = mapper.readValue(result, Object.class);

String indented = mapper.defaultPrettyPrintingWriter().writeValueAsString(json);

System.out.println(indented);//This print statement show correct way I need

model.addAttribute("response", (indented));

নীচে লাইনটি এর মতো কিছু প্রিন্ট করে:

System.out.println(indented);


{
  "attributes" : [ {
    "nm" : "ACCOUNT",
    "error" : "null SYS00019CancellationException in CoreImpl fetchAttributes\n java.util.concurrent.CancellationException\n\tat java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:231)\n\tat java.util.concurrent.FutureTask.",
    "status" : "ERROR"
  } ]
}

এটি আমার দেখানোর দরকার ছিল। তবে যখন আমি এটির মতো মডেলটিতে এটি যুক্ত করি:

model.addAttribute("response", (indented));

এবং তারপরে এটি নীচের মত একটি রেজাল্ট jsp পৃষ্ঠাতে দেখায়:

    <fieldset>
        <legend>Response:</legend>
            <strong>${response}</strong><br />

    </fieldset>

আমি এরকম কিছু পাই:

{ "attributes" : [ { "nm" : "ACCOUNT", "error" : "null    
SYS00019CancellationException in CoreImpl fetchAttributes\n 
java.util.concurrent.CancellationException\n\tat 
java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:231)\n\tat 
java.util.concurrent.FutureTask.", "status" : "ERROR" } ] }

যা আমার দরকার নেই উপরে এটি মুদ্রিত হওয়ার মতোভাবে আমার দরকার ছিল। কেউ আমাকে বলতে পারেন কেন এমন ঘটনা ঘটেছিল?

উত্তর:


252

কোনও পুরানো জেএসএনকে ইনডেন্ট করতে, কেবল এটির মতো বাঁধুন Object:

Object json = mapper.readValue(input, Object.class);

এবং তারপরে এডেন্টেশন দিয়ে লিখুন:

String indented = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(json);

এটি আপনার কাছে ডেটা ম্যাপ করতে প্রকৃত POJO সংজ্ঞায়িত করা এড়িয়ে চলে।

অথবা আপনি JsonNode(জেএসএন ট্রি) পাশাপাশি ব্যবহার করতে পারেন ।


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

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

30
হাই, ডিফল্টপ্রিটপ্রিন্টিং রাইটার () অবচয় করা হয়েছে। ১.৯ থেকে, পরিবর্তে লেখকবিহীন ডেফল্টপ্রিটপ্রিন্টার () ব্যবহার করুন। রেফারেন্স
১.৯.০.0

6
জ্যাকসন ২-এর জন্য সিরিয়ালাইজেশন ফিচারটি ব্যবহার করুন। INDENT_OUTPUT, যা নীচে মার্সেলো সি দ্বারা নির্দিষ্ট করা হয়েছে
মাইক আর

কোন ধারণা কীভাবে জ্যাকসন ব্যবহার করে লিখিত মানটির পরিমাণ প্রকাশ করবেন?
রেয়ানশ মিশ্র

124

সবচেয়ে সহজ এবং সবচেয়ে কমপ্যাক্ট সমাধান (v2.3.3 এর জন্য):

ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.writeValueAsString(obj)

21
আপনি প্রকৃতপক্ষে এটি আরও ছোট করতে পারেন: অবজেক্টম্যাপার ম্যাপার = নতুন অবজেক্টম্যাপার.এনেবল (সিরিয়ালাইজেশন ফিচার.আইএনডিআইইউটিপিটি);
জেসন নিকোলস

26

জ্যাকসন ১.৯+ ব্যবহার করার নতুন উপায়টি নিম্নলিখিত:

Object json = OBJECT_MAPPER.readValue(diffResponseJson, Object.class);
String indented = OBJECT_MAPPER.writerWithDefaultPrettyPrinter()
                               .writeValueAsString(json);

আউটপুট সঠিকভাবে ফর্ম্যাট করা হবে!


1
দুর্ভাগ্যক্রমে, যদি আমার ইনপুটটি রানটাইম তৈরি করা অবজেক্ট না হয় তবে অন্য জসন নয় help
ইন্নোকেনিটি

@ ইন্নোকান্তি তারপরে প্রথম লাইনটি এড়িয়ে যান।
মাটনউপ

2
হ্যাঁ, স্পষ্টতই আমি এমনকি এটি করে ফেলেছি, আমি জানি না কেন আমি কেন এইরকম বোকা মন্তব্য রেখেছি =)
ইনোকন্টেটি

17

জ্যাকসন ১.৯-এর জন্য, আমরা সুন্দর মুদ্রণের জন্য নিম্নলিখিত কোডটি ব্যবহার করতে পারি।

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);

11

আমি মনে করি, এটি জাসন ডেটা সাজানোর সহজ কৌশল,

String indented = (new JSONObject(Response)).toString(4);

যেখানে প্রতিক্রিয়া একটি স্ট্রিং।

কেবল toString()পদ্ধতিতে 4 (ইনডেন্টস্পেস) পাস করুন ।

দ্রষ্টব্য: এটি কোনও লাইব্রেরি ছাড়াই অ্যান্ড্রয়েডে দুর্দান্ত কাজ করে। তবে জাভাতে আপনাকে org.json লাইব্রেরিটি ব্যবহার করতে হবে ।


3
এটি লক্ষণীয় যে জাভা (org.json) লাইব্রেরিতে JSON ব্যবহার করছে ।
স্টিভ চেম্বারস

অ্যান্ড্রয়েডে, এটি কোনও লাইব্রেরি ছাড়াই ডাইরেক্টলিটি ব্যবহার করতে পারে।
আমান গুপ্ত - ShOoTeR

String json = new GsonBuilder().setPrettyPrinting().create().toJson(map); String indentedJson = (new JSONObject(json)).toString(4);কোনও কারণে দ্বিতীয়টি কীগুলির ক্রম হারাচ্ছে
মাইকেল মাইকেলাইলিস

দুর্ভাগ্যক্রমে, বর্তমান পদ্ধতির জসন বস্তুর তালিকা পরিচালনা করে না। আমার অর্থ [{"আইডি": "1"}, {"আইডি": "2"}]
জিনিয়ি

4

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

import java.io.FileReader;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    MyClass myObject = mapper.readValue(new FileReader("input.json"), MyClass.class);
    // this is Jackson 1.x API only: 
    ObjectWriter writer = mapper.defaultPrettyPrintingWriter();
    // ***IMPORTANT!!!*** for Jackson 2.x use the line below instead of the one above: 
    // ObjectWriter writer = mapper.writer().withDefaultPrettyPrinter();
    System.out.println(writer.writeValueAsString(myObject));
  }
}

class MyClass
{
  String one;
  String[] two;
  MyOtherClass three;

  public String getOne() {return one;}
  void setOne(String one) {this.one = one;}
  public String[] getTwo() {return two;}
  void setTwo(String[] two) {this.two = two;}
  public MyOtherClass getThree() {return three;}
  void setThree(MyOtherClass three) {this.three = three;}
}

class MyOtherClass
{
  String four;
  String[] five;

  public String getFour() {return four;}
  void setFour(String four) {this.four = four;}
  public String[] getFive() {return five;}
  void setFive(String[] five) {this.five = five;}
}

সাহায্যের জন্য ড্যানিয়েল ধন্যবাদ। আমার সবচেয়ে শক্ত অংশটি হ'ল কীভাবে আমার JSON কে একটি শ্রেণিতে মডেল করবেন? যদি আমি সেই অংশটি কাজ করি তবে আমি খুব সহজেই এর বাকী কোডগুলি দিতে পারি।
অস্ত্রাগার

আপনি জেএসওএন থেকে আমার পোজো ক্লাসটি লিখেছেন তা একবার দেখে নিতে পারেন? মনে হচ্ছে ঠিক আছে নাকি?
অস্ত্রাগার

3

আপনি বোকা উপায় ব্যবহার করে এটি অর্জন করতে পারেন:

1. অ্যাপাচি থেকে জ্যাকসন ব্যবহার করা

    String formattedData=new ObjectMapper().writerWithDefaultPrettyPrinter()
.writeValueAsString(YOUR_JSON_OBJECT);

বেলো ক্লাস আমদানি করুন:

import com.fasterxml.jackson.databind.ObjectMapper;

এটি গ্রেড নির্ভরতা হ'ল:

compile 'com.fasterxml.jackson.core:jackson-core:2.7.3'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.3'

২. গুগল থেকে জিসন ব্যবহার করা

String formattedData=new GsonBuilder().setPrettyPrinting()
    .create().toJson(YOUR_OBJECT);

বেলো ক্লাস আমদানি করুন:

import com.google.gson.Gson;

এটি গ্রেড হল:

compile 'com.google.code.gson:gson:2.8.2'

এখানে, আপনি সংগ্রহস্থল থেকে সঠিক আপডেট হওয়া সংস্করণ ডাউনলোড করতে পারেন।


2

ObjectMapper.readTree() এক লাইনে এটি করতে পারেন:

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(mapper.readTree(json));

1
আমার এই উত্তরটি পছন্দ করার কারণটি হ'ল এটি JSON ধরণের সরাসরি ম্যাপিং ব্যতীত অন্য কোনও বস্তুর রূপান্তর করে না। এতক্ষণ ইনপুট স্ট্রিংটি বৈধ জেএসএন হিসাবে কার্যকর, আমরা জানি আউটপুট স্ট্রিংটি শব্দার্থগতভাবে জেএসএন সমতুল্য হবে।
এম জাস্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.