【问题标题】:Java String to Json & vice versaJava字符串到Json,反之亦然
【发布时间】:2014-11-18 16:42:54
【问题描述】:

我想将基于字符串的协议转换为 Json,性能是关键

基于字符串的协议类似于

<START>A12B13C14D15<END>

而json是

{'A':12,'B':13,'C':14,'D':15}

我可以正则表达式解析字符串,创建映射并序列化为 Json,但它似乎需要做很多工作,因为我需要实时转换流。 如果我只是进行字符串操作来获取 Json 输出会更有效吗?如何有效地进行转换?

【问题讨论】:

  • 嗯,我相信没有像 Convert String to JSON with Alphabet as Property and int as Value 这样的库,所以我像你说的那样做:解析字符串,创建一个映射并序列化为一个 Json(如果你愿意,你可以使用 GSON)
  • 嗯,开个玩笑,使用像 Jackson 或 GS​​ON 这样的高效 JSON 库来进行编码和/或解码。它可能会比手写代码更快(除非花费大量时间)——您不需要创建Map,只需使用流接口 (JsonGenerator)。而且生成速度超过 200MB/秒,真的,这不会是你的瓶颈(网络或 I/O 会)
  • 如果这很复杂,当然,您不需要创建一个 Map 然后将 Map 序列化为 JSON,但是您可以只使用简单的字符串连接生成 JSON。但如果它更复杂,使用 Maps 和 Arrays 并不是特别低效,而且更容易保持直线。
  • (当然要注意 JSON 对象键值应该用 双引号 (") 括起来。)

标签: java regex json string parsing


【解决方案1】:

JSON 序列化性能可能不是问题。不要过早地优化它。 如果您推出自己的 JSON 序列化程序,您需要付出一些努力,例如正确逃脱。如果性能确实有问题,请查看Jackson,它相当快。

Java 执行正则表达式的速度似乎非常快,因此您可能会觉得它没问题,但请注意,很可能会意外构建一个带有一些输入的正则表达式开始大量回溯并需要几分钟来评估。您可以使用本机 String 方法来解析字符串。

如果性能确实是一个问题,请对不同的方法进行时间测试,选择正确的工具,看看什么需要时间并进行相应的优化。

【讨论】:

    【解决方案2】:

    在 JSON 方面有很多解决方法。代替不需要的Map,POJO 通常是最方便的。以下使用 Jackson (https://github.com/FasterXML/jackson-databind) 库:

    final static ObjectMapper MAPPER = new ObjectMapper(); // remember to reuse for good perf
    
    public class ABCD {
      public int A, B, C, D;
    }
    
    // if you have output stream handy:
    ABCD value = new ABCD(...);
    OutputStream out = ...;
    MAPPER.writeValue(out, value);
    // or if not
    byte[] raw = MAPPER.writeValueAsBytes(value);
    

    或者,如果您想消除更多的开销(实际上,这在这里不太重要):

    JsonGenerator jgen = MAPPER.getFactory().createGenerator(out); jgen.writeStartObject(); jgen.writeNumberField("A", valueA); jgen.writeNumberField("B", valueB); jgen.writeNumberField("C", valueC); jgen.writeNumberField("D", valueD); jgen.writeEndObject(); jgen.close();

    这非常接近您使用手写代码获得的最佳性能。

    【讨论】:

    • 使用 POJO 和映射器可能比使用 Map 效率低。
    • @HotLicks 我对此表示怀疑。 POJO 是更高效的数据结构(映射需要键存储,通过键间接查找;POJO 具有直接索引偏移量)。但这取决于 JSON lib 的实现——我只能说,有了 Jackson,POJO 通常会更快。
    • @HotLicks 让我们看看。我写了这个 -- cowtowncoder.com/blog/archives/2007/02/entry_32.html -- 7 年前;而这个——cowtowncoder.com/blog/archives/2010/04/entry_396.html——稍后。所以是的,我知道我在说什么。此外,在编写了一个 JSON 库、2 个 XML 库(Woodstox、Aalto)以及从事性能基准测试 (github.com/eishay/jvm-serializers) 之后,我对这个领域的性能有了相当多的了解。
    【解决方案3】:

    在我的例子中,我使用这个库来处理 web 应用程序中的 json。

    不记得在哪里找到。希望这会有所帮助:

    http://www.findjar.com/class/org/json/JSONArray.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2015-12-09
      • 1970-01-01
      • 2011-05-18
      • 2012-11-11
      • 1970-01-01
      相关资源
      最近更新 更多