Gson :지도를 직렬화하는 더 쉬운 방법이 있습니까?
Gson 프로젝트 의이 링크는 형식화 된 Map을 JSON으로 직렬화하기 위해 다음과 같은 작업을 수행해야 함을 나타내는 것 같습니다.
public static class NumberTypeAdapter
implements JsonSerializer<Number>, JsonDeserializer<Number>,
InstanceCreator<Number> {
public JsonElement serialize(Number src, Type typeOfSrc, JsonSerializationContext
context) {
return new JsonPrimitive(src);
}
public Number deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
if (jsonPrimitive.isNumber()) {
return jsonPrimitive.getAsNumber();
} else {
throw new IllegalStateException("Expected a number field, but was " + json);
}
}
public Number createInstance(Type type) {
return 1L;
}
}
public static void main(String[] args) {
Map<String, Number> map = new HashMap<String, Number>();
map.put("int", 123);
map.put("long", 1234567890123456789L);
map.put("double", 1234.5678D);
map.put("float", 1.2345F);
Type mapType = new TypeToken<Map<String, Number>>() {}.getType();
Gson gson = new GsonBuilder().registerTypeAdapter(Number.class, new
NumberTypeAdapter()).create();
String json = gson.toJson(map, mapType);
System.out.println(json);
Map<String, Number> deserializedMap = gson.fromJson(json, mapType);
System.out.println(deserializedMap);
}
멋지고 작동하지만 너무 많은 오버 헤드 ( 전체 유형 어댑터 클래스? ) 처럼 보입니다 . JSONLib와 같은 다른 JSON 라이브러리를 사용했으며 다음과 같은 방법으로지도를 작성할 수 있습니다.
JSONObject json = new JSONObject();
for(Entry<String,Integer> entry : map.entrySet()){
json.put(entry.getKey(), entry.getValue());
}
또는 다음과 같은 사용자 지정 클래스가있는 경우 :
JSONObject json = new JSONObject();
for(Entry<String,MyClass> entry : map.entrySet()){
JSONObject myClassJson = JSONObject.fromObject(entry.getValue());
json.put(entry.getKey(), myClassJson);
}
이 프로세스는 더 수동적이지만 코드가 덜 필요하며 Number 또는 대부분의 경우 내 사용자 정의 클래스 에 대한 사용자 정의 유형 어댑터를 작성하는 데 드는 오버 헤드가 없습니다 .
이것이 Gson으로 맵을 직렬화하는 유일한 방법입니까, 아니면 위의 링크에서 Gson이 권장하는 것을 능가하는 방법을 찾은 사람이 있습니까?
Only the TypeToken
part is neccesary (when there are Generics involved).
Map<String, String> myMap = new HashMap<String, String>();
myMap.put("one", "hello");
myMap.put("two", "world");
Gson gson = new GsonBuilder().create();
String json = gson.toJson(myMap);
System.out.println(json);
Type typeOfHashMap = new TypeToken<Map<String, String>>() { }.getType();
Map<String, String> newMap = gson.fromJson(json, typeOfHashMap); // This type must match TypeToken
System.out.println(newMap.get("one"));
System.out.println(newMap.get("two"));
Output:
{"two":"world","one":"hello"}
hello
world
Default
The default Gson implementation of Map serialization uses toString()
on the key:
Gson gson = new GsonBuilder()
.setPrettyPrinting().create();
Map<Point, String> original = new HashMap<>();
original.put(new Point(1, 2), "a");
original.put(new Point(3, 4), "b");
System.out.println(gson.toJson(original));
Will give:
{
"java.awt.Point[x\u003d1,y\u003d2]": "a",
"java.awt.Point[x\u003d3,y\u003d4]": "b"
}
Using enableComplexMapKeySerialization
If you want the Map Key to be serialized according to default Gson rules you can use enableComplexMapKeySerialization. This will return an array of arrays of key-value pairs:
Gson gson = new GsonBuilder().enableComplexMapKeySerialization()
.setPrettyPrinting().create();
Map<Point, String> original = new HashMap<>();
original.put(new Point(1, 2), "a");
original.put(new Point(3, 4), "b");
System.out.println(gson.toJson(original));
Will return:
[
[
{
"x": 1,
"y": 2
},
"a"
],
[
{
"x": 3,
"y": 4
},
"b"
]
]
More details can be found here.
I'm pretty sure GSON serializes/deserializes Maps and multiple-nested Maps (i.e. Map<String, Map<String, Object>>
) just fine by default. The example provided I believe is nothing more than just a starting point if you need to do something more complex.
Check out the MapTypeAdapterFactory class in the GSON source: http://code.google.com/p/google-gson/source/browse/trunk/gson/src/main/java/com/google/gson/internal/bind/MapTypeAdapterFactory.java
So long as the types of the keys and values can be serialized into JSON strings (and you can create your own serializers/deserializers for these custom objects) you shouldn't have any issues.
In Gson 2.7.2 it's as easy as
Gson gson = new Gson();
String serialized = gson.toJson(map);
Map<String, Object> config = gson.fromJson(reader, Map.class);
ReferenceURL : https://stackoverflow.com/questions/8360836/gson-is-there-an-easier-way-to-serialize-a-map
'development' 카테고리의 다른 글
NavigationViewController 신속한 ViewController 제공 (0) | 2020.12.27 |
---|---|
애플리케이션 컨텍스트와 함께 글라이드 이미지 로딩 (0) | 2020.12.27 |
AVCaptureVideoPreviewLayer 방향-가로 방향 필요 (0) | 2020.12.27 |
performFetchWithCompletionHandler가 실행되지 않습니다. (0) | 2020.12.27 |
목표 C-두 날짜 사이의 일수 계산 (0) | 2020.12.27 |