0

JSON オブジェクトと Java オブジェクトが連携して動作する要点を理解するのに苦労しています。基本的に私がする必要があるのは、URL で JSON ファイルをチェックして、使用できるソフトウェアの更新バージョンがあるかどうかを確認することです。接続を開き、JSON をコンソールに出力できましたが、運が良かったのはそれだけです。私は主にGSONを利用しようとしています。以下は私がこれまでに持っているメインコードで、マニフェストはクラスのオブジェクトであり、さらに下に表示されています。現在のプログラムのバージョン番号と比較する必要があるため、主に JSON の「バージョン」フィールドに関心があります。

BufferedReader reader = new BufferedReader(new InputStreamReader(
        connection.getInputStream()));
stringV = reader.readLine();
//System.out.println(manifest);
while ((line = reader.readLine()) != null) {
    stringV = stringV + gson.toJson(line);
    //manifest = manifest + line;
}
System.out.println(manifest);

manifest man = gson.fromJson(manifest, manifest.class);
testString = man.getversion();
System.out.println(test);

私の質問の 1 つは、JSON 専用のクラスに関するものです。JSON のすべてのフィールドに対して宣言、get/set が必要ですか?

public class manifest{
    private List<String> versions;
    private String version;
    private String current;
    private String compatible;
    private String published;
    private String description;
    private List<String> manifest;
    private String jre;

    public List<String> getVersions(){return versions;}
    public String getversion(){return version;}
    public String getcurrent(){return current;}
    public String getcomp(){return compatible;}
    public String getpub(){return published;}
    public String getdesc(){return description;}
    public List<String> getFileList(){return manifest;}
    public String getjre(){return jre;}

    public void setVersions(List<String> versions){this.versions = versions;}
    public void setversion(String version){this.version = version;}
    public void setcurrent(String current){this.current = current;}
    public void setcomp(String compatible){this.compatible = compatible;}
    public void setpub(String published){this.published = published;}
    public void setdesc(String description){this.description = description;}
    public void setFileList(List<String> manifest){this.manifest = manifest;}
    public void setjre(String jre){this.jre = jre;}

    @Override
    public String toString(){
        return String.format("Versions:%s,version:%s,curr:%s,comp:%s,pub:%s,desc:%s,manifest:%s,jre:%s", 
                versions, version, current, compatible, published, description, manifest, jre);
    }
}

JSON の構造は次のとおりです。

      {
       "versions": [
          {
        "version": "II V7.1.2",
        "current": true,
        "compatible": true,
        "published": "2012-04-21T18:25:43-05:00",
        "description": "Stability improvements for users:\n\n-Fix a crash\n-Fix a bug",
        "manifest": [
            {
                "name": "file.jar",
                "checksum": "56116165156111156156116161651161616116165116116516651651"
            }, (more elements here)
         "jre": "1.7.0_17"

私はJSONにまったく慣れていないので、どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

1

実際、オブジェクトの世界で JSON を概念化するのは非常に簡単です。キーが文字列で、値がプリミティブ型 (ブール値、数値、文字列、日付)、配列、または別のマップのいずれかであるデータのマップと考えることができます。値が別のマップになるたびに、オブジェクトを作成します! それはとても簡単です。

あなたの場合、あなたが含めたJSONスニペットを見てみましょう:

{
    "versions": [
        {
            "version": "II V7.1.2",
            "current": true,
            "compatible": true,
            "published": "2012-04-21T18:25:43-05:00",
            "description": "Stability improvements for users:\n\n-Fix a crash\n-Fix a bug",
            "manifest": [
                {
                    "name": "file.jar",
                    "checksum": "56116165156111156156116161651161616116165116116516651651"
                }
            ],
            "jre": "1.7.0_17"
        }
    ]
}

このスニペットの外側の JSON オブジェクトには、 name の配列である単一の JSON 要素が含まれていますversions。この配列の各要素は自然にオブジェクトにマップされ、次のような最上位の定義が得られます。

public class Root {
    private List<Version> versions;

    // Constructors, getters, setters
}

Versionこれで、オブジェクトの詳細を確認できます。次の規則を使用して、Java オブジェクトを作成します。

  • 各プリミティブ型の値を同等の Java プロパティにマップします。
  • オブジェクト型の値をクラスにマップします。
  • 配列を Java コレクション型にマップする

日付はプリミティブではありませんが、マッピングの目的で同じルールを適用します

public class Version {
    private String version;
    private Boolean current;
    private Boolean compatible;
    private Date published;
    private String description;
    private List<Manifest> manifest; // Note the collection *and* object mapping
    private String jre;
    // Constructors, getters, setters
}

public class Manifest {
    private String name;
    private String checksum;
}

かなり単純ですよね?次に、次のコードを使用して、最上位の JSON を最上位のオブジェクトにマップします。

Root obj = new Gson().fromJson(jsonStr, Root.class);

総じて、JSON を取得するために使用しているコードには、不要なコードや間違ったコードが含まれています。

  • StringBuilderより高価な concat 操作ではなく、a を使用して文字列を構築します
  • while ループでは、 への呼び出しgson.toJson(line);は不要であり、実際には正しくありません。
于 2013-03-19T02:39:08.453 に答える