繁体   English   中英

正则表达式模式可删除json数组中的方括号和逗号,以便应用MapReduce

[英]Regex pattern to remove square brackets and commas in a json array in order to apply MapReduce

好吧,我基本上有一个像这样的JSON数组:

[
  {
    product:something, 
    version:something
  },
  {
    product: something,
    version: something
  }
]

我需要删除每个json之间的逗号,就像花括号后的逗号一样,我也需要删除方括号。 这是必需的,因为我要逐元素反序列化,所以如果在它们之间有逗号或括号会给我一个错误,或者对我来说似乎是错误的。

无论如何,我一直试图创建一个正则表达式模式来替换那些元素。 例如,假设读取的第一个json像这样作为字符串:

[ 
 {
  product:something,
  version:something
 },

所以我的模式是这样的: [\\[\\]/}(?=,)]但是,它匹配了最后一个括号和json内的所有逗号,这不是我所需要的。

有人可以帮我吗? 至少请我参考一些教程或其他内容?

编辑:我不能使用任何反序列化器或类似的东西,基本上,我将json数组的每个元素都读为一行,以“}”分隔。

找到了一种执行此操作的方法,在该方法中,我不需要涉及任何正则表达式或对JSON的更改。 无论如何,这是这样的:

首先转到这里https://gist.github.com/Lupus/9988093 ,获取您正在使用的任何API的WholeFileInput格式。 最后,这是我如何在一个映射器中实现它的示例:

package mapreduce;


import java.io.IOException;

import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Mapper;
import org.json.*;

public class CommonErrorsMapper extends Mapper<NullWritable, BytesWritable, TextTriplet, IntWritable> {


         public void map(NullWritable key, BytesWritable value, Context context) throws IOException, InterruptedException{
            String product;
            String version;
            String errorCode;

            String json = new String(value.getBytes());
            try {
                JSONArray jObject = new JSONArray(json);
                for(int i = 0; i < jObject.length(); i++){
                    product = jObject.getJSONObject(i).getString("product");
                    version = jObject.getJSONObject(i).getString("version");
                    errorCode = jObject.getJSONObject(i).getString("errorCode");
                    context.write(new TextTriplet(product, version, errorCode), new IntWritable(1));
                }
            }catch(Exception error){
                error.printStackTrace();
            }
        }
}

离开这里,是因为我发现mapreduce难以理解,使用JSON之类的格式时更是如此。 因此,无论如何,这似乎就是它的全部,除非那是其他人找到了一种无需读取整个文件的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM