帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:BIN  Manipulation  bindings  MAN  Kotlin  gso  GSON  
Kotlin bindings for JSON manipulation via Gson

  • 源代码名称:Kotson
  • 源代码网址:http://www.github.com/SalomonBrys/Kotson
  • Kotson源代码文档
  • Kotson源代码下载
  • Git URL:
    git://www.github.com/SalomonBrys/Kotson.git
  • Git Clone代码到本地:
    git clone http://www.github.com/SalomonBrys/Kotson
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/SalomonBrys/Kotson
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • Kotlin 1.0.6Maven CentralTravisMIT LicenseGitHub issuesSlack channelDonate

    : Gson Kotson Kotlin

    Kotson使你能够使用的 Gson解析和编写 JSON,使用一个简单的语法和更简单的语法。

    Kotson是一组插件扩展函数,这意味着它将实用函数和语法糖添加到Kotlin中的Gson中。 它不会向Gson添加新特性,也不会创建新类型。 因此,无论在源代码还是库中创建的java或者 kotlin,它都可以在任何Gson对象上使用。

    安装

    Maven:

    <dependency>
     <groupId>com.github.salomonbrys.kotson</groupId>
     <artifactId>kotson</artifactId>
     <version>2.5.0</version>
    </dependency>

    Gradle:

    compile 'com.github.salomonbrys.kotson:kotson:2.5.0'

    目录

    用法

    创建 Json

    JsonObject:

    import com.github.salomonbrys.kotson.*valobj: JsonObject = jsonObject(
     "name" to "kotson",
     "creation" to Date().getTime(),
     "files" to 4)

    JsonArray:

    import com.github.salomonbrys.kotson.*valarr: JsonArray = jsonArray("one", "two", 42, 21.5)

    当然,两者的组合:

    import com.github.salomonbrys.kotson.*valobj: JsonObject = jsonObject(
     "property" to "value",
     "array" to jsonArray(
     21,
     "fourty-two",
     jsonObject("go" to "hell")
     )
    )

    JsonPrimitives:

    import com.github.salomonbrys.kotson.*valpi=42.toJson() // java: new JsonPrimitive(42);valpf=42.21f.toJson() // java: new JsonPrimitive(42.21f);valpd=42.21.toJson() // java: new JsonPrimitive(42.21d);valpc='c'.toJson() // java: new JsonPrimitive('c');valpz=true.toJson() // java: new JsonPrimitive(true);valos="coucou".toJson() // java: new JsonPrimitive("coucou");

    设置自定义( e ) 序列化程序

    如果需要 register serializer/deserializer/InstanceCreator ,可以使用以下"生成器"api:

    import com.github.salomonbrys.kotson.*valgson= GsonBuilder()
     .registerTypeAdapter<MyType> {
     serialize {
     /* it.type: Type to serialize from it.context: GSon context it.src : Object to serialize*/ }
     deserialize {
     /* it.type: Type to deserialize to it.context: GSon context it.json : JsonElement to deserialize from*/ }
     createInstances {
     /* it: Type of instance to create*/ }
     }
     .registerTypeHierarchyAdapter<MyOtherType> {
     serialize { /* Same a above */ }
     deserialize { /* Same a above */ }
     createInstances { /* Same a above */ }
     }
     .create()

    当然,你只能声明一个序列化程序。一个反序列化程序或者一个实例创建者。 你不需要宣布所有三个人。

    你不必在初始化Gson时声明所有 JsonSerializer s,JsonDeserializer s 和 InstanceCreator s 。 Kotson允许你使用 JsonSerializerJsonDeserializerInstanceCreator 在不同文件中创建这些类型适配器。 然后,在创建Gson对象时,你将能够对这些对象进行 register:

    //TypeAdapters.ktimport com.github.salomonbrys.kotson.*valpersonSerializer= jsonSerializer { /* Same arguments as before */ }
    //Main.ktimport com.github.salomonbrys.kotson.*valgson= GsonBuilder().registerTypeAdapter<Person>(personSerializer).create()

    设置自定义读者和作者

    Gson有另一个 API ( 命名流 API ),允许 register 作者( 到 JsonWriter ) 和读者的( 来自 JsonReader ) 。
    下面是一个简单 Person 类的示例:

    import com.github.salomonbrys.kotson.*valgson= GsonBuilder()
     .registerTypeAdapter<Person> {
     write {
     beginArray()
     value(it.name)
     value(it.age)
     endArray()
     }
     read {
     beginArray()
     valname= nextString()
     valage= nextInt()
     endArray()
     Person(name, age)
     }
     }
     .create()

    虽然比较复杂且难以处理,但是这个API的优化效果更好。 因此,如果你在性能之后,我建议你使用这个 API 。

    使用这里API有一些缺点:

    • 你必须同时定义 writeread
    • 你不能使用混合( 。serialize + read 或者 write + deserialize ) 。
    • read 中,不能访问正反序列化到( 反序列化的it.type )的确切对象类型。

    如果希望为可以空的读取器或者编写器指定 register,则可以使用 registerNullableTypeAdapter

    你不必在初始化Gson的地方声明所有的TypeAdapter 。 Kotson允许你使用 TypeAdapternullableTypeAdapter 在不同文件中创建这些类型适配器。 然后,在创建Gson对象时,你将能够对这些对象进行 register:

    //TypeAdapters.ktimport com.github.salomonbrys.kotson.*valpersonTypeAdapter= typeAdapter<Person> {
     write { /*...*/ }
     read { /*...*/ }
    }
    //Main.ktimport com.github.salomonbrys.kotson.*valgson= GsonBuilder().registerTypeAdapter<Person>(personSerializer).create()

    Kotson不提供 TypeAdapterFactory 接口的实用工具功能。 因为这个接口定义了通用函数,目前除了在常规 object 或者 class 上实现它之外,还没有其他方法可以使用它。

    解析 JSON

    Kotson提供了一个简单的API,它不受java擦除类型的影响。 这意味着无论输出类型如何,都将正确解析它并消除对 TypeToken的需求。

    import com.github.salomonbrys.kotson.*valgson= Gson()// java: List<User> list = gson.fromJson(src, new TypeToken<List<User>>(){}.getType());vallist1= gson.fromJson<List<User>>(jsonString)vallist2= gson.fromJson<List<User>>(jsonElement)vallist3= gson.fromJson<List<User>>(jsonReader)vallist4= gson.fromJson<List<User>>(reader)

    注意:gson.fromJson<MyType> 将返回非空类型,而 gson.fromJson<MyType?> 将返回可以空类型。 因此代码 gson.fromJson<MyType>("null") 是正确的并且将抛出空指针异常 !

    许多 gson api依赖 java.lang.reflect.Type 来指定类型,但是的javaClass 返回一个类型,它是类型,但却受到类型擦除的影响。 为了协调这个问题,Gson使用 TypeToken 创建 java.lang.reflect.Type 对象,而不使用。 如果你需要这样的类型对象,你可以以简单地使用 TypeToken 函数,同样使用 javaClass 函数。 例如: typeToken<Map<String, List<User>>>()

    注意:TypeToken 函数的行为与gson类的TypeToken 稍有不同。 在提供非专用泛型类型时,typeToken<List<*>> 将返回 Class<List> ( 虽然gson的机制将返回 ParameterizedType ) 。 如果你真的需要 ParameterizedType 作为非专用泛型类型,那么可以使用 gsonTypeToken 函数。

    浏览Json元素

    使用Kotson可以简单地将jsonElement转换为基元。JsonObject 或者 JsonArray:

    import com.github.salomonbrys.kotson.*vals= json.string // java: String s = json.getAsString();vali= json.int // java: int i = json.getAsInt();vala= json.array // java: JsonArray = json.getAsJsonArray();valo= json.obj // java: JsonObject = json.getAsJsonObject();valns= json.nullString // java: String s = json.isJsonNull()? null : json.getAsString();valni= json.nullInt // java: Integer i = json.isJsonNull()? null : json.getAsInt();valna= json.nullArray // java: JsonArray = json.isJsonNull()? null : json.getAsJsonArray();valno= json.nullObj // java: JsonObject = json.isJsonNull()? null : json.getAsJsonObject();

    这些api用于 .string.bool.byte.char.short.int.long.float.double.number 。tar 。

    Kotson提供了一个简单的API,允许你轻松浏览 JsonElementJsonObjectJsonArray:

    import com.github.salomonbrys.kotson.*// java: JsonElement components = colors.getAsJsonObject().get("orange");valcomponents= colors["orange"]// java: JsonElement greenComp = components.getAsJsonArray().get(1);valgreenComp= components[1]// java: int greenComp = json. getAsJsonObject()//. getAsJsonObject("colors")//. getAsJsonArray("orange")//. get(1)//. getAsInt();valgreenComp= json["colors"]["orange"][1].int

    正在改变Json元素

    Kotson允许你改变 JsonObject 或者 JsonArray:

    import com.github.salomonbrys.kotson.*funtest() {
     valarray= jsonArray("zero", "x", "two")
     array[1] ="one" array +="three" array -="zero"valobj= jsonObject()
     obj["this"] ="that" obj +="answer" to 42 obj -="this"}

    复制Json元素

    Kotson允许你为 JsonObject 或者 JsonArray 制作浅表副本( 单级别复制) 或者深层副本( 递归副本):

    import com.github.salomonbrys.kotson.*valshallow= json.shallowCopy()valdeep= json.deepCopy()

    通过属性代理访问对象字段

    Kotson允许你将属性委托给 JsonObject 字段:

    import com.github.salomonbrys.kotson.*
    class Person(publicvalobj: JsonObject) {
     valid:String by obj.byString // Maps to obj["id"]valname:String by obj.byString("fullName") // Maps to obj["fullName"]valbirthDate:Int by obj["dates"].byInt(0) // Maps to obj["dates"][0]}
    我们来谈谈 !

    你读到了你是 awsome ? ! 为什么你不通过 Kotson松弛通道来降低组的空闲时间

    捐赠

    Kotson既可以用于非营利和商业用途,也可以用于。

    如果你想给我的作品提供一些支持或者欣赏,你可以免费给我收费

    这将是( 当然) 极大的感谢,但是无需接收帮助或者支持,我将非常乐意提供免费:



    文章标签:MAN  BIN  bindings  Manipulation  Kotlin  gso  GSON  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语