2

我想通过 Moshi 将对象序列化为 Map。这是我的 Gson 代码

    public static Map<String, String> toMap(Object obj, Gson gson) {
    if (gson == null) {
        gson = new Gson();
    }
    String json = gson.toJson(obj);
    Map<String, String> map = gson.fromJson(json, new TypeToken<Map<String, String>>() {
    }.getType());
    return map;
}

以及如何由 Moshi 编写?

4

5 回答 5

9

这是一种方法。在此处查看toJsonValue 文档。

Moshi moshi = new Moshi.Builder().build();

JsonAdapter<Object> adapter = moshi.adapter(Object.class);

Object jsonStructure = adapter.toJsonValue(obj);
Map<String, Object> jsonObject = (Map<String, Object>) jsonStructure;

如果您知道 的类型obj,最好查找该类型的适配器,而不是 Object。toJson(Object JsonAdadpter 必须在每次调用时查找运行时类型。

于 2017-11-03T16:10:25.277 回答
7

@NanoJava8 解决方案崩溃,但可以使用Map而不是进行微小的更改HashMap

Type type = Types.newParameterizedType(Map.class, String.class, String.class);

JsonAdapter<Map<String,String>> adapter = moshi.adapter(type);

Map<String,String> map = adapter.fromJson(json);

正如Jesse在回答 Moshi support fields as Mapbut not中所述HashMap

于 2019-02-20T14:09:16.273 回答
1
Type type = Types.newParameterizedType(HashMap.class, String.class, String.class);

JsonAdapter<Map<String,String>> adapter = moshi.adapter(type);

Map<String,String> map = adapter.fromJson(json);
于 2017-11-02T03:07:59.417 回答
1
class HashMapJsonAdapter<K, V>(
  private val keyAdapter: JsonAdapter<K>,
  private val valueAdapter: JsonAdapter<V>
) : JsonAdapter<HashMap<K, V>>() {

  @Throws(IOException::class)
  override fun toJson(writer: JsonWriter, map: HashMap<K, V>?) {
    writer.beginObject()
    for ((key, value) in map ?: emptyMap<K, V>()) {
      if (key == null) {
        throw JsonDataException("Map key is null at ${writer.path}")
      }
    keyAdapter.toJson(writer, key)
    valueAdapter.toJson(writer, value)
    }
    writer.endObject()
  }

  @Throws(IOException::class)
  override fun fromJson(reader: JsonReader): HashMap<K, V>? {
    val result = linkedMapOf<K, V>()
    reader.beginObject()
    while (reader.hasNext()) {
      val name = keyAdapter.fromJson(reader)
      val value = valueAdapter.fromJson(reader)
      val replaced = result.put(name!!, value!!)
      if (replaced != null) {
        throw JsonDataException("Map key '$name' has multiple values at path ${reader.path} : $replaced and value")
      }
    }
    reader.endObject()
    return result
  }

  override fun toString(): String = "JsonAdapter($keyAdapter=$valueAdapter)"

  companion object
}
于 2020-04-27T12:36:26.240 回答
0

在科特林:

val type = Types.newParameterizedType(
            MutableMap::class.java,
            String::class.java,
            String::class.java
        )
        val adapter: JsonAdapter<Map<String, String>> = moshi.adapter(type)
        val map: Map<String, String> = adapter.fromJson(responseJson)
于 2022-02-09T15:32:57.557 回答