在golang解组之前从字符串之类的json中删除无效json字符的最佳方法

时间:2019-01-19 22:00:27

标签: json go unmarshalling utf

为了提供一些背景信息,我正在使用adb logcat和idevicesyslog从android和ios设备读取设备日志。我需要的特定日志是swift / c#/ java / etc字典,通过adb logcat / idevicesyslog转换为字符串。我希望将这些包含JSON之类的日志(例如字符串)转换为有效JSON。这在大多数情况下都没问题。

但是,有时这些日志/字符串输出包含的字符(\ 134,\ M,\ t等)在解组为JSON时会引起问题。我将它们解组为JSON以将其发送到其他地方。

例如,原始设备日志可能具有以下内容: {“ foo”:“ bar”,“ foo”:“ bar \ 134 / \ 134 / bar \ 134 / bar \ 134 / bar”} {“ foo”:“ bar”,“ foo”:“ bar \ M / \ 134 / bar \ 134 / bar \ M / bar”}

当尝试解组时,这些结果会导致类似“错误:字符串转义码中的无效字符'M'”的错误

大多数日志不包含这些字符,因此这不是问题。但是,一些极端情况包含这些情况,这会造成问题。

这些类型的字符是否有合适的名称? (c#转义字符?)是否有golang软件包可以将其从字符串中删除?目前,我只是删除遇到的特定字符串(如果它们出现在字符串中),但是我觉得有更好的方法。将我遇到的字符添加到可删除字符列表中并不是一个好习惯。

总结一下,

idevicesyslog日志给了我这样的字符串: {“ foo”:“ bar”,“ foo”:“ bar \ 134 / \ 134 / bar \ 134 / bar \ 134 / bar”}

这不能被解组。

idevicesyslog日志给了我这样的字符串: {“ foo”:“ bar”,“ foo”:“ bar bar bar bar”}

这可以取消编组。

当前解决方案:将我遇到的新问题添加到列表中,并在拆封之前将其删除

有希望的解决方案:自动检测并删除

1 个答案:

答案 0 :(得分:1)

使用正则表达式将无效的八进制转义序列替换为空格:

    package test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.GeneralPath;

import javax.swing.JComponent;

public class Triangle extends JComponent implements MouseListener{

private int x,y;
private Color c;
public Triangle(int x, int y, Color c)
{
    this.x = x;
    this.y = y;
    this.c = c;
    setPreferredSize(new Dimension(100, 100));
    addMouseListener(this);
}

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    GeneralPath path = new GeneralPath();

    g2d.setColor(c);
    path.moveTo(x, y);
    path.lineTo(x, y);
    path.lineTo(x+50, y);
    path.lineTo(x, y-50);
    path.closePath();
    g2d.fill(path);
    repaint();
}

public void draw(Graphics g)
{

    Graphics2D g2d = (Graphics2D) g;
    GeneralPath path = new GeneralPath();

    g2d.setColor(c);
    path.moveTo(x, y);
    path.lineTo(x, y);
    path.lineTo(x+50, y);
    path.lineTo(x, y-50);
    path.closePath();
    g2d.fill(path);
    repaint();
}

@Override
public void mouseClicked(MouseEvent e) {
    c = Color.cyan;
    repaint();

}

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}

}

您还可以解析八进制值并将其转换为有效的JSON转义序列:

var octalEscapePat = regexp.MustCompile(`\\[0-7]{3}`)

func fix(src string) string {
    return octalEscapePat.ReplaceAllString(src, " ")
}

\ M的处理方式类似。

https://play.golang.org/p/-gtxrvnBSrx