Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 特殊字符打断Json_Java_Json_Gson - Fatal编程技术网

Java 特殊字符打断Json

Java 特殊字符打断Json,java,json,gson,Java,Json,Gson,我需要处理包含大量特殊字符和空格的JSON。我在stack上的其他地方读到过,Gson Java库做得很好,所以我正在使用它。在使用fromJsonJson字符串、对象类方法将Json字符串转换为对象时,我注意到,只要字符串中的数据包含任何特殊字符或空格,就会抛出一个异常,该异常是未终止的对象。删除特殊字符可使其按预期工作 为了更好地说明这种情况: ArrayList<Person> people = new ArrayList<Person>(); Person p1

我需要处理包含大量特殊字符和空格的JSON。我在stack上的其他地方读到过,Gson Java库做得很好,所以我正在使用它。在使用fromJsonJson字符串、对象类方法将Json字符串转换为对象时,我注意到,只要字符串中的数据包含任何特殊字符或空格,就会抛出一个异常,该异常是未终止的对象。删除特殊字符可使其按预期工作

为了更好地说明这种情况:

ArrayList<Person> people = new ArrayList<Person>();

Person p1 = new Person("Matteo", 999);
Person p2 = new Person("Adam", 999);
Person p3 = new Person("Steve", 999);

people.add(p1);
people.add(p2);
people.add(p3);

String json = new Gson().toJson(people);
System.out.println(json);

ArrayList people2 = new Gson().fromJson(json, ArrayList.class);

for (int i = 0; i < people2.size(); i++) {
    Person pn = new Gson().fromJson(people2.get(i).toString(), Person.class);
    System.out.println(people2.get(i).toString());
    System.out.println(pn.name);
}
上面的代码按预期工作,但如果不是Matteo I,而是键入Ma:tteo或Ma tteo或任何其他包含特殊字符的字符串,则代码将中断

那么有没有办法绕过这个问题呢?或者,有没有比使用此库更好的解决方案

提前感谢

Gson的工作做得很好

如何使用Gson库存在两个问题:

您正在将fromJsonString类与泛型结合使用。文档说明,在使用泛型时,应使用fromJsonString,键入:

对于对象为泛型类型的情况,请调用fromJsonString,type

首先将JSON字符串反序列化为Java结构(在本例中为ArrayList),然后在其上循环,对于每个对象,再次反序列化它,依赖ArrayList中包含的对象的toString方法。事实上,您的列表根本不包含Person对象,而是包含com.google.gson.internal包中的LinkedTreeMap对象。您可以通过调用people2.geti.getClass来获取对象的类

您真的不需要遍历这个ArrayList的元素,然后自己反序列化这些元素。如果你需要浏览你的结构中包含的每一个列表,那么当这个结构比你的结构更复杂时,这将是一个受伤的世界

只需摆脱for循环,将toJsonString类调用替换为对fromJsonString类型的调用。就这些

// We're using the TypeToken class, to handle generic types
Type type = new TypeToken<List<Person>>() { }.getType();
List<Person> newPeople = new Gson().fromJson(json, type);

// Print all names
newPeople.stream()
    .map(t -> t.name)
    .forEach(System.out::println);
注释

问题的一部分原因是您使用的是ArrayList。不要使用原始类型,它们只允许向后兼容

我需要处理包含大量特殊字符和空格的JSON

现在还不清楚你说的特殊角色是什么意思。法律明确规定了什么是允许的,什么是不允许的。您的JSON字符串应该遵循标准,然后就可以开始了

请尝试使用此代码

    ArrayList<Person> people = new ArrayList<Person>();

    Person p1 = new Person("Ma:tteo", 999);
    Person p2 = new Person("Adam", 999);
    Person p3 = new Person("Steve", 999);

    people.add(p1);
    people.add(p2);
    people.add(p3);


    Gson gson = new Gson();
    String json = gson.toJson(people);
    System.out.println(json);

    List<Person> personList = gson.fromJson(json, new TypeToken<List<Person>>(){}.getType());

    for (int i = 0; i < personList.size(); i++) {
        Person person = personList.get(i);
        System.out.println(person.toString());
        System.out.println(person.name);
    }

您能提供一个JSON的示例吗?您可能已经弄乱了字符编码,或者JSON无效。您使用什么代码将内容读入字符串?我猜字符编码有问题。有一些规则可以定义字符串是否是有效的JSON字符串,我相信Gson可以完成它的工作。您需要添加代码示例和JSON。我个人更喜欢使用org.JSON库。例如,您可以使用,或者,非常感谢,您的解决方案也非常有效,但我确认了上面的一个,因为它提供了更多信息。