জ্যাকসন ২.২ এর অবজেক্টম্যাপার থেকে প্রেটি প্রিন্টিং জেএসএন


140

এই মুহূর্তে আমার কাছে একটি উদাহরণ রয়েছে org.fasterxml.jackson.databind.ObjectMapperএবং Stringসুন্দর জেএসওএন সহ একটি পেতে চাই । আমার গুগল অনুসন্ধানগুলির সমস্ত ফলাফল জ্যাকসন ১.x পদ্ধতিতে করার পদ্ধতি নিয়ে এসেছে এবং আমি এটি ২.২ দিয়ে করার উপযুক্ত, অ-অবহেলিত উপায় খুঁজে পাচ্ছি না। যদিও আমি বিশ্বাস করি না যে কোডটি এই প্রশ্নের জন্য একেবারে প্রয়োজনীয়, তবে আমার এখনই যা রয়েছে তা এখানে:

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
System.out.println("\n\n----------REQUEST-----------");
StringWriter sw = new StringWriter();
mapper.writeValue(sw, jsonObject);
// Want pretty version of sw.toString() here

উত্তর:


276

আপনি SerializationFeature.INDENT_OUTPUTনিজের ObjectMapperপছন্দ মতো করে সেটি সেট করে চমত্কার-মুদ্রণ সক্ষম করতে পারেন:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
আমি এটি চেষ্টাও করেছি তবে মনে হয় এটি SerializationConfigসমাধান হয়েছে তবে SerializationConfig.Featureতা হয়নি। এটি বেশ কিছু মুদ্রণের অন্য পদ্ধতি বলে মনে হচ্ছে যা অবহেলিত হয়ে গেছে যদি না আমি কিছু মিস করি। এখানে একটি Featureশ্রেণি রয়েছে যা পৃথকভাবে পৃথক হয়ে যায় তবে এর INDENT_OUTPUTভিতরে ধ্রুবক থাকে না । :(
অ্যান্থনি অ্যাটকিনসন

অসাধারণ! আপনি এটি কীভাবে পেয়েছেন তা জানতে আমি খুব পছন্দ করব;)
অ্যান্থনি অ্যাটকিনসন

1
: আমি কি আমার প্রকল্পের এক দিকে তাকিয়ে, কিন্তু এটা মনে হচ্ছে, এটা এখানে যে github.com/FasterXML/jackson-databind অধীনে "সাধারণভাবে ব্যবহৃত বৈশিষ্ট্য"
gregwhitaker

প্রাসঙ্গিক আমদানিটি হ'ল আমদানি com.fasterxml.jackson.databind। {সিরিয়ালাইজেশন ফিচার, অবজেক্টম্যাপার}
dgh

2
২.২.১-তে আমার জন্য এটি যা লেগেছে: org.codehaus.jackson.map.SerializationConfig.Feature আমদানি করুন; mapper.enable (Feature.INDENT_OUTPUT);
হার্শওয়ার

46

ম্যাকিয়ং-এর মতে , যাদুর প্রবণতাটি JSON কে প্রিন্টdefaultPrintingWriter করার জন্য :

আরও নতুন সংস্করণ:

System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonInstance));

পুরানো সংস্করণ:

System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonInstance));

দেখে মনে হচ্ছে আমি দ্রুত একটি বাজে লাফিয়েছি। আপনি gson চেষ্টা করতে পারেন , যার সুন্দর-মুদ্রণ সমর্থন করে :

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOutput = gson.toJson(someObject);

আশাকরি এটা সাহায্য করবে...


1
আমি এই নিবন্ধটি পেয়েছি এবং এটি খুঁজে পেয়ে হতাশ হয়েছি যে এটি দুর্দান্ত মুদ্রণের সেই অবমূল্যায়নের অন্যতম উপায়। ক্লাসে defaultPrettyPrintingWriter()আর উপলব্ধ নেই (এমনকি অবচিত পদ্ধতি হিসাবে) ObjectMapper
অ্যান্টনি অ্যাটকিনসন

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

7
জ্যাকসন ২.৩ এ অ্যান্থনি অ্যাটকিনসনকে একটি পদ্ধতি রয়েছেObjectMapper.writerWithDefaultPrettyPrinter()
ম্যাট বি

36

জ্যাকসন এপিআই পরিবর্তন হয়েছে:

new ObjectMapper()
.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(new HashMap<String, Object>());

3
এটি এখনও ব্যবহার করা সম্ভব (জ্যাকসন ২.7..6 সহ) new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());। আপনাকে কেবল কনফিগার করা লেখকটিই ব্যবহার করতে হবে তা নিশ্চিত করতে হবে ObjectMapper
মার্টিন

3

IDENT_OUTPUT আমার জন্য কিছুই করেনি, এবং আমার জ্যাকসন ২.২.৩ জারের সাথে কাজ করে এমন একটি সম্পূর্ণ উত্তর দিতে:

public static void main(String[] args) throws IOException {

byte[] jsonBytes = Files.readAllBytes(Paths.get("C:\\data\\testfiles\\single-line.json"));

ObjectMapper objectMapper = new ObjectMapper();

Object json = objectMapper.readValue( jsonBytes, Object.class );

System.out.println( objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString( json ) );
}

0

আপনি যদি কোনও প্রক্রিয়াতে সমস্ত অবজেক্টম্যাপার উদাহরণগুলির জন্য ডিফল্টরূপে এটি চালু করতে চান তবে এখানে একটি সামান্য হ্যাক দেওয়া হবে যা INDENT_OUTPUT এর ডিফল্ট মানটিকে সত্য হিসাবে সেট করবে:

val indentOutput = SerializationFeature.INDENT_OUTPUT
val defaultStateField = indentOutput.getClass.getDeclaredField("_defaultState")
defaultStateField.setAccessible(true)
defaultStateField.set(indentOutput, true)

0

আপনি যদি বসন্ত এবং জ্যাকসন সংমিশ্রণটি ব্যবহার করে থাকেন তবে নীচের হিসাবে এটি করতে পারেন। আমি @ গ্রেগুইটাইটারকে প্রস্তাবিত অনুসারে অনুসরণ করছি তবে বসন্ত শৈলীতে বাস্তবায়ন করছি।

<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
    <property name="dateFormat">
        <bean class="java.text.SimpleDateFormat">
            <constructor-arg value="yyyy-MM-dd" />
            <property name="lenient" value="false" />
        </bean>
    </property>
    <property name="serializationInclusion">
        <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">
            NON_NULL
        </value>
    </property>
</bean>

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <ref bean="objectMapper" />
    </property>
    <property name="targetMethod">
        <value>enable</value>
    </property>
    <property name="arguments">
        <value type="com.fasterxml.jackson.databind.SerializationFeature">
            INDENT_OUTPUT
        </value>
    </property>
</bean>

0

অন্যরা যারা এই প্রশ্নটি দেখেন কেবল তাদের একটি JSON স্ট্রিং থাকে (কোনও বস্তুতে নয়) তবে আপনি এটিকে একটিতে রেখে দিতে পারেন HashMapএবং এখনও ObjectMapperকাজটি করতে পারেন। resultপরিবর্তনশীল আপনার JSON স্ট্রিংকে হয়।

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.Map;

// Pretty-print the JSON result
try {
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> response = objectMapper.readValue(result, HashMap.class);
    System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response));
} catch (JsonParseException e) {
    e.printStackTrace();
} catch (JsonMappingException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} 

-8

এটা চেষ্টা কর.

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);

13
7 মাস পরে নির্বাচিত উত্তরটি সদৃশ করা সত্যিই সহায়ক নয়।
ইগোর রদ্রিগেজ

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