কিভাবে জাভাতে সাবলীলভাবে JSON তৈরি করতে?


106

আমি এরকম কিছু নিয়ে ভাবছি:

String json = new JsonBuilder()
  .add("key1", "value1")
  .add("key2", "value2")
  .add("key3", new JsonBuilder()
    .add("innerKey1", "value3"))
  .toJson();

কোন জাভা জেএসএন লাইব্রেরি এই ধরণের সাবলীল বিল্ডিংয়ের জন্য সবচেয়ে ভাল?

আপডেট : আমি GSON আবৃত এবং প্রায় কাঙ্ক্ষিত ফলাফল পেয়েছি ... এক ঝিঁকা সঙ্গে


1
আমি মনে করি না যে আমি কোনও জেএসওএন লাইব্রেরি দেখেছি যা এই স্টাইলটি অনুসরণ করে। আপনি কি চান তা করতে আপনি একটি বিদ্যমান গ্রন্থাগারটি বাড়িয়ে দিতে পারেন?
আরথ

1
@ অ্যারোথ - আমরা কথা বলার সাথে সাথে com.google.gson এর চারপাশে একটি মোড়ক লিখছি।
রিপার 234

1
প্রায় প্রস্তুত - stackoverflow.com/questions/8876271/...
ripper234

1
মানচিত্র এবং তালিকার উপযুক্ত "নীড়" তৈরি করুন এবং এটি ক্রমিক করুন। "লং চেইন পলিমার" বিবৃতি এড়িয়ে চলুন।
হট লিকস

উত্তর:


140

আমি org.json লাইব্রেরি ব্যবহার করছি এবং এটি সুন্দর এবং বন্ধুত্বপূর্ণ বলে মনে করেছি।

উদাহরণ:

String jsonString = new JSONObject()
                  .put("JSON1", "Hello World!")
                  .put("JSON2", "Hello my World!")
                  .put("JSON3", new JSONObject().put("key1", "value1"))
                  .toString();

System.out.println(jsonString);

আউটপুট:

{"JSON2":"Hello my World!","JSON3":{"key1":"value1"},"JSON1":"Hello World!"}

15
এটি খুব সাবলীল নয়।
ভ্লাদ

আপনার প্রদত্ত ওয়েবটি আর কাজ করে না। আপনি এটি আপডেট করা আপত্তি করতে চান?
সাšা জেজনিলোভিয়

13
@ ভ্ল্যাড - সাবলীল নির্মাতারা আমার কাছে ঠিক এটাই পরামর্শ দেন। আপনি কি সেটআপের একটি উদাহরণ প্রদান করতে পারেন যা আপনি ভাবেন এটি আরও ভাল?
স্কাব্বো

3
এটি এখনও ক্লিনার বিকল্প। এটি হাস্যকর বিষয় যে জাভা ডিভসকে এখনও 2020 সালে
জেএসএন

112

দেখুন জাভা EE 7 JSON স্পেসিফিকেশন । এটি সঠিক উপায়:

String json = Json.createObjectBuilder()
            .add("key1", "value1")
            .add("key2", "value2")
            .build()
            .toString();

8
এটি 2015 সালে সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত কারণ এটি javax.jsonজাভা 7 এবং তার পরে অংশ later
শ্রীধর সারনোবাত

42
এটি জাভা ইই এপিআই, জাভা এসই নয়।
igorp1024

Javax.json API এ স্ট্রিং অবজেক্ট থেকে কীভাবে জসনস্ট্রিং অবজেক্ট তৈরি করবেন তা সম্পর্কে কোনও ধারণা?
রেমন্ড


12
একমাত্র জন্য মাভেন নির্ভরতাjavax.json প্যাকেজ এই এক
JeanValjean

12

আমি সম্প্রতি সাবলীলভাবে জিসন অবজেক্ট তৈরি করার জন্য একটি গ্রন্থাগার তৈরি করেছি:

http://jglue.org/fluent-json/

এটি এর মতো কাজ করে:

  JsonObject jsonObject = JsonBuilderFactory.buildObject() //Create a new builder for an object
  .addNull("nullKey")                            //1. Add a null to the object

  .add("stringKey", "Hello")                     //2. Add a string to the object
  .add("stringNullKey", (String) null)           //3. Add a null string to the object

  .add("numberKey", 2)                           //4. Add a number to the object
  .add("numberNullKey", (Float) null)            //5. Add a null number to the object

  .add("booleanKey", true)                       //6. Add a boolean to the object
  .add("booleanNullKey", (Boolean) null)         //7. Add a null boolean to the object

  .add("characterKey", 'c')                      //8. Add a character to the object
  .add("characterNullKey", (Character) null)     //9. Add a null character to the object

  .addObject("objKey")                           //10. Add a nested object
    .add("nestedPropertyKey", 4)                 //11. Add a nested property to the nested object
    .end()                                       //12. End nested object and return to the parent builder

  .addArray("arrayKey")                          //13. Add an array to the object
    .addObject()                                 //14. Add a nested object to the array
      .end()                                     //15. End the nested object
    .add("arrayElement")                         //16. Add a string to the array
    .end()                                       //17. End the array

    .getJson();                                  //Get the JsonObject

String json = jsonObject.toString();

এবং জেনেরিকের যাদুতে এটি সংকলন ত্রুটিগুলি উত্পন্ন করে যদি আপনি কোনও সম্পত্তির নাম ব্যতীত কোনও সামগ্রীর কী বা কোনও উপাদানের সাথে কোনও অ্যারের সাথে একটি উপাদান যুক্ত করার চেষ্টা করেন:

JsonObject jsonArray = JsonBuilderFactory.buildArray().addObject().end().add("foo", "bar").getJson(); //Error: tried to add a string with property key to array.
JsonObject jsonObject = JsonBuilderFactory.buildObject().addArray().end().add("foo").getJson(); //Error: tried to add a string without property key to an object.
JsonArray jsonArray = JsonBuilderFactory.buildObject().addArray("foo").getJson(); //Error: tried to assign an object to an array.
JsonObject jsonObject = JsonBuilderFactory.buildArray().addObject().getJson(); //Error: tried to assign an object to an array.

শেষ পর্যন্ত এপিআই-এ ম্যাপিং সমর্থন রয়েছে যা আপনাকে আপনার ডোমেন অবজেক্টগুলিকে জেএসওনে ম্যাপ করার অনুমতি দেয়। জাভা 8 প্রকাশের সময় লক্ষ্যটি হ'ল আপনি এই জাতীয় কিছু করতে সক্ষম হবেন:

Collection<User> users = ...;
JsonArray jsonArray = JsonBuilderFactory.buildArray(users, { u-> buildObject()
                                                                 .add("userName", u.getName())
                                                                 .add("ageInYears", u.getAge()) })
                                                                 .getJson();

8

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

এখানে ব্যবহারের একটি উদাহরণ রয়েছে:

import static JsonNodeBuilders.array;
import static JsonNodeBuilders.object;

...

val request = object("x", "1").with("y", array(object("z", "2"))).end();

যা নিম্নলিখিত JSON এর সমতুল্য:

{"x":"1", "y": [{"z": "2"}]}

এখানে ক্লাসগুলি রয়েছে:

import static lombok.AccessLevel.PRIVATE;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;

import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.val;

/**
 * Convenience {@link JsonNode} builder.
 */
@NoArgsConstructor(access = PRIVATE)
public final class JsonNodeBuilders {

  /**
   * Factory methods for an {@link ObjectNode} builder.
   */

  public static ObjectNodeBuilder object() {
    return object(JsonNodeFactory.instance);
  }

  public static ObjectNodeBuilder object(@NonNull String k1, boolean v1) {
    return object().with(k1, v1);
  }

  public static ObjectNodeBuilder object(@NonNull String k1, int v1) {
    return object().with(k1, v1);
  }

  public static ObjectNodeBuilder object(@NonNull String k1, float v1) {
    return object().with(k1, v1);
  }

  public static ObjectNodeBuilder object(@NonNull String k1, String v1) {
    return object().with(k1, v1);
  }

  public static ObjectNodeBuilder object(@NonNull String k1, String v1, @NonNull String k2, String v2) {
    return object(k1, v1).with(k2, v2);
  }

  public static ObjectNodeBuilder object(@NonNull String k1, String v1, @NonNull String k2, String v2,
      @NonNull String k3, String v3) {
    return object(k1, v1, k2, v2).with(k3, v3);
  }

  public static ObjectNodeBuilder object(@NonNull String k1, JsonNodeBuilder<?> builder) {
    return object().with(k1, builder);
  }

  public static ObjectNodeBuilder object(JsonNodeFactory factory) {
    return new ObjectNodeBuilder(factory);
  }

  /**
   * Factory methods for an {@link ArrayNode} builder.
   */

  public static ArrayNodeBuilder array() {
    return array(JsonNodeFactory.instance);
  }

  public static ArrayNodeBuilder array(@NonNull boolean... values) {
    return array().with(values);
  }

  public static ArrayNodeBuilder array(@NonNull int... values) {
    return array().with(values);
  }

  public static ArrayNodeBuilder array(@NonNull String... values) {
    return array().with(values);
  }

  public static ArrayNodeBuilder array(@NonNull JsonNodeBuilder<?>... builders) {
    return array().with(builders);
  }

  public static ArrayNodeBuilder array(JsonNodeFactory factory) {
    return new ArrayNodeBuilder(factory);
  }

  public interface JsonNodeBuilder<T extends JsonNode> {

    /**
     * Construct and return the {@link JsonNode} instance.
     */
    T end();

  }

  @RequiredArgsConstructor
  private static abstract class AbstractNodeBuilder<T extends JsonNode> implements JsonNodeBuilder<T> {

    /**
     * The source of values.
     */
    @NonNull
    protected final JsonNodeFactory factory;

    /**
     * The value under construction.
     */
    @NonNull
    protected final T node;

    /**
     * Returns a valid JSON string, so long as {@code POJONode}s not used.
     */
    @Override
    public String toString() {
      return node.toString();
    }

  }

  public final static class ObjectNodeBuilder extends AbstractNodeBuilder<ObjectNode> {

    private ObjectNodeBuilder(JsonNodeFactory factory) {
      super(factory, factory.objectNode());
    }

    public ObjectNodeBuilder withNull(@NonNull String field) {
      return with(field, factory.nullNode());
    }

    public ObjectNodeBuilder with(@NonNull String field, int value) {
      return with(field, factory.numberNode(value));
    }

    public ObjectNodeBuilder with(@NonNull String field, float value) {
      return with(field, factory.numberNode(value));
    }

    public ObjectNodeBuilder with(@NonNull String field, boolean value) {
      return with(field, factory.booleanNode(value));
    }

    public ObjectNodeBuilder with(@NonNull String field, String value) {
      return with(field, factory.textNode(value));
    }

    public ObjectNodeBuilder with(@NonNull String field, JsonNode value) {
      node.set(field, value);
      return this;
    }

    public ObjectNodeBuilder with(@NonNull String field, @NonNull JsonNodeBuilder<?> builder) {
      return with(field, builder.end());
    }

    public ObjectNodeBuilder withPOJO(@NonNull String field, @NonNull Object pojo) {
      return with(field, factory.pojoNode(pojo));
    }

    @Override
    public ObjectNode end() {
      return node;
    }

  }

  public final static class ArrayNodeBuilder extends AbstractNodeBuilder<ArrayNode> {

    private ArrayNodeBuilder(JsonNodeFactory factory) {
      super(factory, factory.arrayNode());
    }

    public ArrayNodeBuilder with(boolean value) {
      node.add(value);
      return this;
    }

    public ArrayNodeBuilder with(@NonNull boolean... values) {
      for (val value : values)
        with(value);
      return this;
    }

    public ArrayNodeBuilder with(int value) {
      node.add(value);
      return this;
    }

    public ArrayNodeBuilder with(@NonNull int... values) {
      for (val value : values)
        with(value);
      return this;
    }

    public ArrayNodeBuilder with(float value) {
      node.add(value);
      return this;
    }

    public ArrayNodeBuilder with(String value) {
      node.add(value);
      return this;
    }

    public ArrayNodeBuilder with(@NonNull String... values) {
      for (val value : values)
        with(value);
      return this;
    }

    public ArrayNodeBuilder with(@NonNull Iterable<String> values) {
      for (val value : values)
        with(value);
      return this;
    }

    public ArrayNodeBuilder with(JsonNode value) {
      node.add(value);
      return this;
    }

    public ArrayNodeBuilder with(@NonNull JsonNode... values) {
      for (val value : values)
        with(value);
      return this;
    }

    public ArrayNodeBuilder with(JsonNodeBuilder<?> value) {
      return with(value.end());
    }

    public ArrayNodeBuilder with(@NonNull JsonNodeBuilder<?>... builders) {
      for (val builder : builders)
        with(builder);
      return this;
    }

    @Override
    public ArrayNode end() {
      return node;
    }

  }

}

নোট বাস্তবায়ন ব্যবহার করে Lombok , কিন্তু আপনি খুব সহজেই জাভা boilerplate, পূরণ করার জন্য এটি desugar পারবেন না।


2
String json = new JsonBuilder(new GsonAdapter())
  .object("key1", "value1")
  .object("key2", "value2")
  .object("key3")
    .object("innerKey1", "value3")
    .build().toString();

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

String json = new JsonBuilder(new JacksonAdapter()).

অনুরোধে আমি আনন্দের সাথে অন্যদের যুক্ত করব, একে একে নিজে প্রয়োগ করাও বেশ সহজ।


দুর্ভাগ্যক্রমে এই মুহুর্তে কেন্দ্রীভূত নয়, github.com/HknL/JsonBuilder/issues/8 দেখুন
ডিসচুল্টন

1

দেখে মনে হচ্ছে আপনি সম্ভবত json-lib এর পেতে চান:

http://json-lib.sourceforge.net/

ডগলাস ক্রকফোর্ড হলেন যে লোকটি জেএসএন আবিষ্কার করেছিল; তার জাভা গ্রন্থাগারটি এখানে:

http://www.json.org/java/

শোনা যাচ্ছে যে জসন-লিবের লোকেরা যেখানে ক্রকফোর্ড ছেড়েছিল সেখানে তুলেছে। উভয়ই JSON কে পুরোপুরি সমর্থন করে, উভয় ব্যবহার (সামঞ্জস্যপূর্ণ, যতদূর আমি বলতে পারি) JSONObject, JSONArray এবং JSONFunction কনস্ট্রাকশন।

'আশা করি এইটি কাজ করবে ..


এটি সাবলীল বাক্য গঠন সমর্থন করে?
রিপার 234


0

আপনি নিজের লিখতে চেয়েছেন এটি থেকে অনেক সহজ, JsonElementInterfaceএকটি পদ্ধতি string toJson()এবং একটি বিমূর্ত শ্রেণীর জন্য একটি ইন্টারফেস ব্যবহার করুনAbstractJsonElement যে ইন্টারফেস বাস্তবায়ন,

তারপরে আপনাকে যা করতে হবে তার একটি JSONPropertyইন্টারফেস কার্যকর করার জন্য একটি ক্লাস করতে হবে , এবং JSONValue(কোনও টোকেন), JSONArray([...]), এবংJSONObject ({...}) যা বিমূর্ত শ্রেণিকে প্রসারিত করে

JSONObjectএকটি তালিকা রয়েছে JSONPropertyএর
JSONArrayএকটি তালিকা আছেAbstractJsonElement s 'এর

প্রত্যেকটিতে আপনার অ্যাড ফাংশনটি সেই ধরণের একটি ভাররগ তালিকা গ্রহণ করে ফিরে আসা উচিত this

এখন আপনি যদি কিছু পছন্দ না করেন তবে আপনি এটি টুইট করতে পারেন

ইন্টারফেস এবং বিমূর্ত শ্রেণীর বেনিফিটটি হ'ল JSONArrayবৈশিষ্ট্যগুলি গ্রহণ করতে পারে না, তবে JSONPropertyবস্তু বা অ্যারে গ্রহণ করতে পারে

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