2

この構造に似た Java オブジェクトから json ファイルを作成したい:

{「ユーザー」:

 {"1" : 
     { "ids" : [1,2,3], "names" : ["anton","berta","charlie"] },

 {"2" :
     { "ids" : [4,5,6], "names" : ["dora","emil","friedrich"] },

...等々。

私の問題は、2 番目の階層の数値を生成する方法がわからないことです。すべてのチュートリアルで、クラス名または注釈を使用して階層名が生成されることがわかりましたが、この方法を使用して要求された名前を作成することはできません。

「手で」json Stirngを生成する巨大なメソッドを書かずにそうする方法はありますか?

グリーツ

4

2 に答える 2

0

各 json エントリを作成するために必要なコードはそれほど多くありません。

public static String toJson(int i, List<User> users) {
    StringBuilder sb = new StringBuilder("{\"").append(i).append("\" : { \"ids\" : [");
    for (User user : users)
        sb.append(user.getId()).append(",");
    sb.setCharAt(sb.length() - 1, ']');
    sb.append(", \"names\" : [\"");
    for (User user : users)
        sb.append(user.getName()).append("\",\"");
    return sb.replace(sb.length() - 2, sb.length(),"] } ,").toString();
}

この方法が整っていれば、期間中に新しいユーザーをリストに追加し、各リストに連続番号を割り当てることは簡単です。


完全なテスト コードとその出力を次に示します。

static class User {
    private final int id;
    private final String name;

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

public static String toJson(int i, List<User> users) {
    StringBuilder sb = new StringBuilder("{\"").append(i).append("\" : { \"ids\" : [");
    for (User user : users)
        sb.append(user.getId()).append(",");
    sb.setCharAt(sb.length() - 1, ']');
    sb.append(", \"names\" : [\"");
    for (User user : users)
        sb.append(user.getName()).append("\",\"");
    return sb.replace(sb.length() - 2, sb.length(),"] } ,").toString();
}

public static void main(String[] args) {//throws Exception {
    List<User> users = new ArrayList<User>();
    users.add(new User(1, "anton"));
    users.add(new User(2, "berta"));
    users.add(new User(3, "charlie"));
    System.out.println(toJson(1, users));
 }

出力:

{"1" : { "ids" : [1,2,3], "names" : ["anton","berta","charlie"] } ,
于 2013-07-17T13:46:23.783 に答える
0

例としてGsonを見てみましょう:

次のようにGsonカスタマイズシリアライザーを使用できます(クラスUsersを作成します。そうしないと、他のリストがMySerializerを使用しますが、これは予想外です)

import com.google.common.collect.Lists;

import com.google.gson.*;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static class User {
        private List<Integer> ids;
        private List<String> names;

        public User(List<Integer> ids, List<String> names) {
            this.ids = ids;
            this.names = names;
        }
    }

    public static class Users extends ArrayList<User> {

    }

    public static void main(String[] args) {
        Users users = new Users();
        users.add(new User(Lists.newArrayList(1, 2, 3), Lists.newArrayList("anton", "berta", "charlie")));
        users.add(new User(Lists.newArrayList(4, 5, 6), Lists.newArrayList("dora", "emil", "friedrich")));

        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Users.class, new MySerializer());
        System.out.printf(gsonBuilder.create().toJson(users));
    }

    public static class MySerializer implements JsonSerializer<Users> {
        @Override
        public JsonElement serialize(Users users, Type type, JsonSerializationContext jsonSerializationContext) {
            JsonObject jsonObject = new JsonObject();
            for (int i = 0; i < users.size(); i++) {
                jsonObject.add(String.valueOf(i + 1), jsonSerializationContext.serialize(users.get(i)));
            }
            return jsonObject;
        }
    }
}

別の簡単な方法は、次のようにリストをマップに入れ、json を作成することです。

import com.google.common.collect.Lists;
import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Test {
  public static class User {
    private List<Integer> ids;
    private List<String> names;

    public User(List<Integer> ids, List<String> names) {
      this.ids = ids;
      this.names = names;
    }
  }

  public static void main(String[] args) {
      List<User> users = new ArrayList<User>();
      users.add(new User(Lists.newArrayList(1, 2, 3), Lists.newArrayList("anton", "berta", "charlie")));
      users.add(new User(Lists.newArrayList(4, 5, 6), Lists.newArrayList("dora", "emil", "friedrich")));

      Map<String, User> map = new LinkedHashMap<String, User>();
      for (int i = 0; i < users.size(); i++) {
          map.put(String.valueOf(i + 1), users.get(i));
      }

      System.out.printf(new Gson().toJson(map));
  }
}
于 2013-07-17T13:15:00.310 に答える