【问题标题】:How to filter JSON data with good performances如何过滤性能良好的 JSON 数据
【发布时间】:2012-08-01 09:32:48
【问题描述】:

我在寻找解决这个问题的好方法时遇到了一些问题:我从 RESTful API 获取 JSON 数据,我想根据某个字段的特定值对其进行过滤,处理过滤后的数据,然后发送给客户。

以这个 JSON 为例:

{
"element1": {
    "width": 500,
    "height": 500
},
"element2": { 
    "width": 300,
    "height": 200
},
"element3": {
    "width": 600,
    "height": 100
}

}

如何仅过滤掉高度>=200 或宽度

PS:仅供参考,我会用java编写代码..

【问题讨论】:

  • 除非 API 允许您指定条件,否则您无能为力。
  • 我看不到迭代的任何替代方案。如果你能得到 XML 而不是 JSON,你可以使用 XPath,在这种事情上它可能会快得多。
  • JSon 不是处理这类事情最有效的格式。在将数据转换为 JSON 之前,您应该过滤数据。
  • 我怀疑从 Web 服务中检索和解析数据需要很长时间。除非您可以将过滤推送到远程 API 中,否则不会有太大改进。

标签: java json performance rest filtering


【解决方案1】:

用 ServletStream 代替 FileIS 试试这个例子

    import java.io.FileInputStream;

    import javax.xml.stream.XMLInputFactory;
    import javax.xml.stream.XMLStreamConstants;
    import javax.xml.stream.XMLStreamReader;

    import de.odysseus.staxon.json.JsonXMLInputFactory;

    public class Test {
        static XMLInputFactory ir = new JsonXMLInputFactory();

        public static void main(String[] args) throws Exception {

            FileInputStream servletInput = new FileInputStream("d:/test.json");
            XMLStreamReader reader = ir.createXMLStreamReader(servletInput,
                    "UTF-8");
            int typ = reader.next();
            while (typ != XMLStreamConstants.END_DOCUMENT) {

                if (typ == XMLStreamConstants.START_ELEMENT) {
                    String tagName = reader.getName().getLocalPart();
                    if (tagName.equals("width")) {
                        if (Integer.parseInt(reader.getElementText()) > 500) {
                            System.out.println("!FOUND!");
                        }
                    }
                }
                typ = reader.next();
            }
        }
    }

问候

【讨论】:

  • 有趣的 API。它是如何工作的?它真的可以流式传输吗(即避免将整个 JSON 一次性读入内存)?
  • 是的,自己尝试一下:创建一个 d:/test.json 内容为:{ "element1": { "width": 600, "height": 500 },"element2": { "宽度": 600, "高度": 500 },239-.,ßBROKENSTRUCTURE}}}}}};您将看到控制台写入 2x !FOUND!以及之后的堆栈跟踪。
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多