JSONからCSVへの変換中はJSONキーの順序を維持します


82

ここhttp://www.json.org/java/index.htmlで提供されているJSONライブラリを使用して、必要なjson文字列をCSVに変換しています。しかし、私が抱えている問題は、変換後にキーの順序が失われることです。

これは変換コードです:

    JSONObject jo = new JSONObject(someString);
    JSONArray ja = jo.getJSONArray("items");
    String s = CDL.toString(ja);
    System.out.println(s);

これは「someString」の内容です。

{
    "items":
    [
        {
            "WR":"qwe",
            "QU":"asd",
            "QA":"end",
            "WO":"hasd",
            "NO":"qwer"
        },
    ]
}

結果は次のとおりです。

WO,QU,WR,QA,NO
hasd,asd,qwe,end,qwer

私が期待しているのは、キーの順序を維持することです。

WR,QU,QA,WO,NO
qwe,asd,end,hasd,qwer

このライブラリを使用してこの結果を得る方法はありますか?そうでない場合、結果のキーの順序を維持する機能を提供する他のライブラリはありますか?


4
辞書は分類されていません。JSONが順序を保証するとは思いません。
falmarri 2010

2
情報をありがとう。しかし、アプリケーションでJSONを使用する以外に選択肢はなく、アプリケーションはキーの順序を維持する必要があります:(
Hery

私の場合、問題は順序の欠如ではなく、非決定論的であるということです。時々私は、キーを取得foo、キーの前にbar、時にはbar前にfoo。これにより、テストを作成することが困難になります。
Sridhar Sarnobat 2015年

私もこの必要性に遭遇しましたが、それはリアルタイムテスト中の高速ログ比較のためです。高スループットのアプリケーションでは、新しく生成されたログを以前に生成されたログとリアルタイムで比較する必要があります。他の方法もありますが、ログはJSON形式にすることをお勧めします。ただし、CPUの使用を最小限に抑えるために、私は独自の文字列への直接JSONライターを作成しています。内部構造はまったく必要ありません。ログの文字列を高速に比較するために、キーの順序を維持できます。予測可能な順序が必要なのには十分な理由があります。
ジョーラップ2017年

JSONを特定の順序のCSVファイルに変換する独自のコードを記述します。これにより、両方の形式が想定されていることを尊重できます。
MartijnScheffer19年

回答:


95

それを行う(ハッキーな)方法があります...しかし、あなたはすべきではありません。

JSONでは、オブジェクトは次のように定義されます。

オブジェクトは、名前と値のペアの順序付けられていないセットです。

http://json.orgを参照してください。

JSONのほとんどの実装では、オブジェクトの名前と値のペアの順序を維持する努力はありません。これは、(定義上)重要ではないためです。

順序を保持したい場合は、データ構造を再定義する必要があります。例えば

{
    "items":
    [
        [
            {"WR":"qwe"},
            {"QU":"asd"},
            {"QA":"end"},
            {"WO":"hasd"},
            {"NO":"qwer"}
        ],
    ]
}

またはもっと簡単に:

{
    "items":
    [
        {"WR":"qwe"},
        {"QU":"asd"},
        {"QA":"end"},
        {"WO":"hasd"},
        {"NO":"qwer"}
    ]
}

ファローアップ

情報をありがとうございますが、アプリケーションでJSONを使用する以外に選択肢はなく、アプリケーションはJSONオブジェクトの定義に関係なくキーの順序を維持する必要があります... JSONファイルの形式を変更することは許可されていません同様に...

そのファイル構造を設計した人とは難しい会話をする必要があり、それを変更することはできません。それは/彼らは明らかに間違っています。あなたは彼らを説得する必要があります。

彼らが本当にあなたにそれを変えさせないなら:

  • JSONと呼ばないように主張する必要があります... 'そうではありません。
  • 順序を保持するJSON実装が見つからない限り、この「JSONではない」形式を処理するために特別にコードを記述/変更する必要があることを指摘しておく必要があります。彼らが有料のクライアントである場合、あなたがしなければならないこの余分な仕事に対して彼らが支払うことを確認してください。
  • 「JSONではない」を他のツールで使用する必要がある場合は、問題が発生することを指摘しておく必要があります。確かに、この問題は何度も発生します...

この種のことは本当に悪いことです。一方では、ソフトウェアは、相互運用性を促進するように設計された、確立された/長年の仕様に違反します。一方、この不完全な(JSONではない!)ファイル形式を設計したニトウィットは、おそらく他の人のシステムなどをだましているでしょう。システムは彼らのナンセンスに対処できません。

更新

JSON RFC(RFC 7159)がこの主題について述べていることも読む価値があります。ここにいくつかの抜粋があります:

RFC 4627の公開以来、JSONは非常に広く使用されています。この経験により、特定のパターンが明らかになりました。これは、仕様では許可されていますが、相互運用性の問題を引き起こしています。

JavaScript Object Notation(JSON)は、構造化データをシリアル化するためのテキスト形式です。..。

JSONは、4つのプリミティブ型(文字列、数値、ブール値、およびnull)と2つの構造化型(オブジェクトと配列)を表すことができます。

オブジェクトは、0個以上の名前と値のペアの順序付けられていないコレクションです。ここで、名前は文字列であり、値は文字列、数値、ブール値、null、オブジェクト、または配列です。

JSON解析ライブラリは、オブジェクトメンバーの順序を呼び出し側ソフトウェアに表示するかどうかに関して異なることが確認されています。動作がメンバーの順序に依存しない実装は、これらの違いの影響を受けないという意味で相互運用可能です。


3
@ YogeshSomani-「解決策」は、適切なJSONライブラリを取得し、それを「ハッキング」して、キーの順序を保持することです。例については、ゲイリーの回答を参照してください。しかし、このようなJSON仕様の乱用を助長するのは悪い考えであるため、標準のJSONライブラリがこれを行うことを期待するべきではありません。実際の解決策は、JSONを適切に使用するようにアプリケーションを修正することです。
スティーブンC

10
最も純粋で絶対的であることは素晴らしいことですが、私たち自身をからかってはいけません。JSONファイルが定義された値の順序を保持する必要がある現実のシナリオがあります。それらを任意の順序で渡して受け入れることは基本的なjsonアプローチですが、jsonドキュメントを取得して、均等にシリアル化/逆シリアル化できる機能とは異なると思います。jsonドキュメントを取得し、それを使用して、順序を保持する必要がある別の標準WDDX、HTMLなどのドキュメントを作成する必要があるのは一般的な使用例です
Andrew Norman

3
@ AndrewNorman-「必要性」についてあなたが言ったことが本当に本当なら、仕様は変更されるべきであり、変更されたはずです。現実には、JSONで他の方法で順序を表すのは簡単です。
スティーブンC

2
JSONでは、情報がキーの順序でエンコードされていないことだけが必要です。それ以外の場合はJSONではありません。シリアル化の一貫性は別の問題です。単一のアプリ内では、通常、共通のJSONライブラリを使用することで一貫性を保証できますが、単一のソリューションが複数のプラットフォームまたはフレームワークにまたがる場合など、例外があります。このような場合、不整合に対処する方法(非効率性を導入する)を見つけるか、一貫性を確保する方法を見つける必要があります。どちらのアプローチも有効です。
ジョーラップ2017年

2
「JSONは、情報がキーの順序でエンコードされていないことだけを要求します。それ以外の場合はJSONではありません。」。あなたはそれを間違って書いたと思います。正しい説明は、「JSONでは、情報がキーの順序でエンコードされている必要はありません」というものです。これらの二つの文の間には大きな違いがあります....
スティーブンC

47

秩序を維持することは非常に簡単です。DBレイヤーからUIレイヤーへの順序を維持することに関して同じ問題がありました。

JSONObject.javaファイルを開きます。内部的には、順序を維持しないHashMapを使用します。

LinkedHashMapに変更します。

    //this.map = new HashMap();
    this.map = new LinkedHashMap();

これは私のために働いた。コメントで教えてください。JSONライブラリ自体には、JSONOrderdObject.javaのように、順序を維持する別のJSONObjectクラスが必要です。私は名前を選ぶのがとても苦手です。


2
svn checkoutjson-シンプル。ファイルorg.json.simple.JSONObjectを変更し、<code> JOSNObjectはLinkedHashMap ... </ code>を<code> .. HashMap .. </ code>から拡張し、インポートを修正します。v1.1.1。
Marku 2013年

2
これは、私が試してみようとは思わなかった素晴らしい1行のソリューションです。完全に機能し、他のコードを変更する必要はありませんでした。+1
DaaaahWhoosh 2015

素晴らしい修正。あなたはヒーローですサー
グレゴリーノワコウスキー2017

動作しませんでした。インポートを追加し、あなたが言ったように変更しましたthis.map = new LinkedHashMap<String, Object>();。このようにしようとしても、まだ動作しません。助けてください ?
タレク

4
ほんとうに?(笑?ニーズに合わせてJSONライブラリを変更しますか?これが会社の知識ベースで低下していることを想像できます。「mvnクリーンインストールを実行し、jarをダウンロードして検索し、逆コンパイルしてから、HashMapをLinkedHashMapに置き換えます」。これは、複数の開発者チームに最適です(そうではありません)。
ChrisNeve18年

23

JSONObject.java通過したマップを取得します。それであってもよいLinkedHashMapTreeMap、それはかかりますhashmapマップがnullの場合のみ。

これは、JSONObject.javaマップのチェックを行うクラスのコンストラクターです。

 public JSONObject(Map paramMap)
  {
    this.map = (paramMap == null ? new HashMap() : paramMap);
  }

したがって、jsonオブジェクトコンストラクトLinkedHashMapをビルドしてから、次のようにコンストラクターに渡す前に、

LinkedHashMap<String, String> jsonOrderedMap = new LinkedHashMap<String, String>();

jsonOrderedMap.put("1","red");
jsonOrderedMap.put("2","blue");
jsonOrderedMap.put("3","green");

JSONObject orderedJson = new JSONObject(jsonOrderedMap);

JSONArray jsonArray = new JSONArray(Arrays.asList(orderedJson));

System.out.println("Ordered JSON Fianl CSV :: "+CDL.toString(jsonArray));

したがって、JSONObject.javaクラスを変更する必要はありません。それが誰かを助けることを願っています。


3
良い答えです。通常のJavaでは機能しますが、Androidでは機能しません。Androidでorg.json.JSONObjectを確認しましたが、Androidがまだ内部で作成されたハッシュマップを使用しているのは残念です。名前と値のペアのみをparamMapからHashMapにコピーします... :(
正宗白布鞋2013年

JsonObjectを注文しましたが、そのオブジェクトをJsonArrayに追加しようとすると、順序付けされていないオブジェクトが表示されます。オブジェクトを配列に配置する必要があります。配列のオブジェクトが必要です。次に、ヘッダーを配列に配置して送り返します。例:1つのオブジェクト。{CUSTOMER_SECTOR_ID = 611、CUSTOMER_NO = 0000003204、CUSTOMER_NAME =MARMARİS-KARASGIDACARASTÜKETİMMADDELERİGIDALOJ。} 2つのオブジェクトを配列に配置すると次のようになります:[{"CUSTOMER_NAME": "SILA GIDA PAZARMA 0000003122 "、" CUSTOMER_SECTOR_ID ":" 611 "}、{" CUSTOMER_NAME ":" M ":" 0013114714 "、" CUSTOMER_SECTOR_ID ":" 611 "}]ご覧のとおり間違っています。私はそれをどのように修正することができます
サヒンYanlık

2
@DeepakNagaraj。私はあなたの解決策を試しましたが、うまくいきませJSONObjectんでしたLinkedHashMap。私のように注文されていません。あなたはorg.jsonlibを使用していますか?
イスマイル

1
これはorg.json1つではありません..それはあなたがそれに与えるHashMapものは何でも、内部的に定義しMapます:@Deepakあなたが使用した実装を私たちに指摘できますか?
Campa 2015

8
これはorg.jsonライブラリでは機能しません。JSONObjectマップを引数として渡して新しいオブジェクトを作成すると、常にに変換されますHashMap。コンストラクターは最初に新しいマップを作成します:this.map = new HashMap<String, Object>();、次にマップをループし、すべての要素を彼のにコピーしますHashMap
イタチ2015

13

この種の問題に対してより冗長ですが、広く適用できる解決策は、データ構造のペアを使用することです。つまり、順序を含むリストと、関係を含むマップです。

例えば:

{
    "items":
    [
        {
            "WR":"qwe",
            "QU":"asd",
            "QA":"end",
            "WO":"hasd",
            "NO":"qwer"
        },
    ],
    "itemOrder":
        ["WR", "QU", "QA", "WO", "NO"]
}

itemOrderリストを繰り返し、それらを使用してマップ値を検索します。注文は維持され、応急修理は行われません。

私はこの方法を何度も使用しました。


マップが単純なキーと値のペアではない場合、これは複雑になります...
zfj3ub94rf576hc4eegm 2018年

10

リフレクトを使用した別のハッキーソリューション:

JSONObject json = new JSONObject();
Field map = json.getClass().getDeclaredField("map");
map.setAccessible(true);//because the field is private final...
map.set(json, new LinkedHashMap<>());
map.setAccessible(false);//return flag

1
答えが
わかり

1
秘訣は、デフォルトのHashMapの代わりにLinkedHashMapを使用するようにクラスを内部的に変更し、JSONオブジェクトにデータを配置した順序で含めることです。これは直接ソートされませんが、解析されたデータはすでにソートされているため、機能しました。 。
fabe 2016年

見た目は良いですが、map.set(json、new LinkedHashMap <>());の後にJson文字列を解析する方法。Json Stringがコンストラクターに渡されるからですよね?新しいJSONObject(jsonString)のように。
M.ウスマン・カーン

また、これは機能しませんでした。フィールド「map」がなく、すでにLinckedHashMapであるフィールド「nameValuePairs」がありますが、それでも機能しません。
M.ウスマン・カーン

1
JSONObjectのどの実装を使用していますか?私はorg.jsonバージョン20140107を使用しており、順序を保持する必要があり、それが私にとってどのように機能したかです。
fabe 2016年


4

同じ問題に遭遇したばかりですが、作成者が使用した最終的な解決策は、カスタムContainerFactoryを使用することでした。

public static Values parseJSONToMap(String msgData) {
    JSONParser parser = new JSONParser();
    ContainerFactory containerFactory = new ContainerFactory(){
        @Override
        public Map createObjectContainer() {
            return new LinkedHashMap();
        }

        @Override
        public List creatArrayContainer() {
            return null;
        }
    };
    try {
        return (Map<String,Object>)parser.parse(msgData, containerFactory);
    } catch (ParseException e) {
        log.warn("Exception parsing JSON string {}", msgData, e);
    }
    return null;
}  

http://juliusdavies.ca/json-simple-1.1.1-javadocs/org/json/simple/parser/JSONParser.html#parse(java.io.Reader,org.json.simple.parser.ContainerFactory)を参照してください


本当に非常に優れた実用的なソリューション。containerFactoryのメソッドローカル匿名内部クラスを作成するのはどうですか?
Shailesh Saxena 2018

3

解決しました。

ここからJSON.simpleライブラリhttps://code.google.com/p/json-simple/を使用してJSON文字列を読み取り、キーの順序を維持し、ここからJavaCSVライブラリを使用しましたhttp://sourceforge.net/ projects / javacsv /をCSV形式に変換します。


これがうまくいったことに驚いています。JSONObjectクラスのコードとコメント(code.google.com/p/json-simple/source/browse/trunk/src/main/java/…)の両方を読んだところによると、保存することは何もしていません。キーの順序。
スティーブンC

1
ここでは完全なソリューションを指定しませんでしたが、その要点は、json-simpleがjsonオブジェクトの格納に使用されるデータ構造を指定できるファクトリを提供することです。LinkedHashMapを使用するように指定するだけです。
Hery 2012年

@Hery、私は同じ問題に直面していますが、それを解決できませんでした。私が使うorg.json変換することList<LinkedHahMap>JSONArray作成するためにはCSVCSV私と同じ順序で作成されていないがList 。ここに表示されている2つのCSVライブラリを使用しようとしましたが、変換するメソッドが見つかりませんでした。詳細を教えてください。
イスマイル

2

私はこれが解決され、質問がずっと前に尋ねられたことを知っていますが、私は同様の問題を扱っているので、これにまったく異なるアプローチを与えたいと思います:

配列の場合、「配列は値の順序付けられたコレクションです」と表示されます。でhttp://www.json.org/ -しかし、オブジェクトは(「オブジェクトは、名前/値ペアの順不同の集合である。」)順序付けされていません。

なぜそのオブジェクトが配列にあるのだろうか-それはそこにない順序を意味する。

{
"items":
[
    {
        "WR":"qwe",
        "QU":"asd",
        "QA":"end",
        "WO":"hasd",
        "NO":"qwer"
    },
]
}

したがって、解決策は、キーを「実際の」配列に配置し、次のようにデータをオブジェクトとして各キーに追加することです。

{
"items":
[
    {"WR": {"data": "qwe"}},
    {"QU": {"data": "asd"}},
    {"QA": {"data": "end"}},
    {"WO": {"data": "hasd"}},
    {"NO": {"data": "qwer"}}
]
}

したがって、これは元のモデリングとその意図を再考しようとするアプローチです。しかし、関連するすべてのツールが元のJSON配列の順序を保持するかどうかはテストしていません(そして疑問に思います)。


1
これでは、キーを検索できません。
mickeymoon 2015年

次に、何が必要ですか?ハッシュまたは注文されたもの!?両方を組み合わせたい場合は、両方を作成し、それらの構造の1つにもう1つの構造のインデックスを付けます。それ以外の場合、これは設計上の問題、または関心の混合のようです。
cslotty 2015年

1
これは、関心を混合することではなく、かなり妥当なユースケースであり、Javaなどの言語では、挿入順序を保持する順序付きマップであるLinkedHashMapなどの構造によって処理されます。次に、何が必要ですか。定義された順序でキーを反復処理できるようにし、キーをすばやく検索できるようにします。@Robotic Pantsによる答えは、少しハックですが、かなりうまくいくと思います。
mickeymoon 2015年

それは本当です、ミッキームーン、私はそれを言おうとしていました!しかし、JSONにはこれは存在しませんね。次に、そのようなことを提供する言語/メカニズムを関与させる必要があります。
cslotty 2015年

1

現実の世界では、アプリケーションにはほとんどの場合、JSONとの間でシリアル化/逆シリアル化されるJavaBeanまたはドメインがあります。JSONオブジェクトの仕様は順序を保証するものではなく、その動作に対する操作は要件を正当化しないことはすでに述べました。私のアプリケーションでも同じシナリオがあり、読みやすさのためだけに順序を維持する必要がありました。標準のジャクソンの方法を使用して、JavaBeanをJSONにシリアル化しました。

Object object = getObject();  //the source java bean that needs conversion
String jsonString = new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(object);

順序付けられた要素のセットでjsonを作成するために、変換に使用したJavaBeanでJSONプロパティアノテーションを使用します。以下の例:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({"name","phone","city","id"})
public class SampleBean implements Serializable {
    private int id;
    private String name:
    private String city;
    private String phone;

    //...standard getters and setters
}

上で使用したgetObject():

public SampleBean getObject(){
    SampleBean bean  = new SampleBean();
    bean.setId("100");
    bean.setName("SomeName");
    bean.setCity("SomeCity");
    bean.setPhone("1234567890");
    return bean;
}

出力は、Jsonプロパティの順序アノテーションに従って表示されます。

{
    name: "SomeName",
    phone: "1234567890",
    city: "SomeCity",
    id: 100
}

0

最も安全な方法は、おそらく出力の生成に使用されるキーメソッドをオーバーライドすることです。

new JSONObject(){
  @Override
  public Iterator keys(){
    TreeSet<Object> sortedKeys = new TreeSet<Object>();
    Iterator keys = super.keys();
    while(keys.hasNext()){
      sortedKeys.add(keys.next());
    }
    return sortedKeys.iterator();
  }
};

1
これは述べられた問題を解決しません。これにより、キーが並べ替えられます...しかし、質問では、挿入順序を保持するように求められます。
スティーブンC

0

patchFor(answer @gary):

$ git diff JSONObject.java                                                         
diff --git a/JSONObject.java b/JSONObject.java
index e28c9cd..e12b7a0 100755
--- a/JSONObject.java
+++ b/JSONObject.java
@@ -32,7 +32,7 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.Collection;
 import java.util.Enumeration;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Iterator;
 import java.util.Locale;
 import java.util.Map;
@@ -152,7 +152,9 @@ public class JSONObject {
      * Construct an empty JSONObject.
      */
     public JSONObject() {
-        this.map = new HashMap<String, Object>();
+//      this.map = new HashMap<String, Object>();
+        // I want to keep order of the given data:
+        this.map = new LinkedHashMap<String, Object>();
     }

     /**
@@ -243,7 +245,7 @@ public class JSONObject {
      * @throws JSONException
      */
     public JSONObject(Map<String, Object> map) {
-        this.map = new HashMap<String, Object>();
+        this.map = new LinkedHashMap<String, Object>();
         if (map != null) {
             Iterator<Entry<String, Object>> i = map.entrySet().iterator();
             while (i.hasNext()) {

0

次のコードを使用して、JSON配列のカスタムのORDEREDシリアル化と逆シリアル化を行うことができます(この例では、文字列を注文していると想定していますが、すべてのタイプに適用できます)。

シリアル化

JSONArray params = new JSONArray();
int paramIndex = 0;

for (String currParam : mParams)
{
    JSONObject paramObject = new JSONObject();
    paramObject.put("index", paramIndex);
    paramObject.put("value", currParam);

    params.put(paramObject);
    ++paramIndex;
}

json.put("orderedArray", params);

デシリアライズ

JSONArray paramsJsonArray = json.optJSONArray("orderedArray");
if (null != paramsJsonArray)
{
    ArrayList<String> paramsArr = new ArrayList<>();
    for (int i = 0; i < paramsJsonArray.length(); i++)
    {
        JSONObject param = paramsJsonArray.optJSONObject(i);
        if (null != param)
        {
            int paramIndex = param.optInt("index", -1);
            String paramValue = param.optString("value", null);

            if (paramIndex > -1 && null != paramValue)
            {
                paramsArr.add(paramIndex, paramValue);
            }
        }
    }
}

0

あなたの例:

{
    "items":
    [
        {
            "WR":"qwe",
            "QU":"asd",
            "QA":"end",
            "WO":"hasd",
            "NO":"qwer"
        },
        ...
    ]
}

要素「itemorder」を追加します

{
    "items":
    [
        {
            "WR":"qwe",
            "QU":"asd",
            "QA":"end",
            "WO":"hasd",
            "NO":"qwer"
        },
        ...
    ],
    "itemorder":["WR","QU","QA","WO","NO"]
}

このコードは、列のタイトル行なしで目的の出力を生成します。

JSONObject output = new JSONObject(json);
JSONArray docs = output.getJSONArray("data");
JSONArray names = output.getJSONArray("itemOrder");
String csv = CDL.toString(names,docs);

これは、今、私は行が注文したが、ヘッダなしで持って、CSVのヘッダを削除
ペドロ・ホアキンを

0

jsonObjectを使用する代わりに、CsvSchemaをより簡単に使用して、オブジェクトをcsvに直接変換してみてください

CsvSchema schema = csvMapper.schemaFor(MyClass.class).withHeader();
        csvMapper.writer(schema).writeValueAsString(myClassList);

そしてそれはあなたのpojo@JsonPropertyOrderを持っている注文IDを維持します


0

アンダースコア-javaは、jsonの読み取り中に要素の順序を保持します。私はプロジェクトのメンテナーです。

String json = "{\n"
      + "    \"items\":\n"
      + "    [\n"
      + "        {\n"
      + "            \"WR\":\"qwe\",\n"
      + "            \"QU\":\"asd\",\n"
      + "            \"QA\":\"end\",\n"
      + "            \"WO\":\"hasd\",\n"
      + "            \"NO\":\"qwer\"\n"
      + "        }\n"
      + "    ]\n"
      + "}";
System.out.println(U.fromJson(json));

// {items=[{WR=qwe, QU=asd, QA=end, WO=hasd, NO=qwer}]}

-1

ウィンクソリューションをテストし、正常に動作しています。

@Test
public void testJSONObject() {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("bbb", "xxx");
    jsonObject.put("ccc", "xxx");
    jsonObject.put("aaa", "xxx");
    jsonObject.put("xxx", "xxx");
    System.out.println(jsonObject.toString());
    assertTrue(jsonObject.toString().startsWith("{\"xxx\":"));
}

@Test
public void testWinkJSONObject() throws JSONException {
    org.apache.wink.json4j.JSONObject jsonObject = new OrderedJSONObject();
    jsonObject.put("bbb", "xxx");
    jsonObject.put("ccc", "xxx");
    jsonObject.put("aaa", "xxx");
    jsonObject.put("xxx", "xxx");
    assertEquals("{\"bbb\":\"xxx\",\"ccc\":\"xxx\",\"aaa\":\"xxx\",\"xxx\":\"xxx\"}", jsonObject.toString());
}

Mavenの依存関係:<dependency> <groupId> org.apache.wink </ groupId> <artifactId> wink-json4j </ artifactId> <version> 1.4 </ version> </ dependency>
jgpelaez 2015

@cypressiousと同じ答え... 2年前に投稿されました。そして、この例は実際の価値を追加しません。
スティーブンC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.