Java Gson解析器因空白字符而崩溃

Java Gson解析器因空白字符而崩溃,java,gson,Java,Gson,我有一个JSON格式的文件。GSON解析器在遇到空白时,如状态=“西弗吉尼亚”一样崩溃,但它可以解析“空白”字符被替换的“西弗吉尼亚”。我正在Java中使用BufferedReader 但是如果我传递相同的硬编码字符串,解析器就会工作 import java.io.* ; import com.google.gson.*; public class gson_test { public static void main(String[] args) throws FileNotFo

我有一个JSON格式的文件。GSON解析器在遇到空白时,如状态=“西弗吉尼亚”一样崩溃,但它可以解析“空白”字符被替换的“西弗吉尼亚”。我正在Java中使用
BufferedReader

但是如果我传递相同的硬编码字符串,解析器就会工作

import java.io.* ;

import com.google.gson.*;

public class gson_test {
    public static void main(String[] args)  throws FileNotFoundException {
        // TODO Auto-generated method stub
        BufferedReader br2 = null ;
        String jsonStr =  "[{month = august, weather:clear}, [333] , {addr : {place = {city = city_name, county : its_name}, state = \"West Virginia\" } } ]" ;
        // System.out.printf("json-str : %s \n", jsonStr);
        GsonParseStr(jsonStr, (JsonElement) null );
        try  {
            String file2read_json = "c:\\enter\\filename\\here";  
            br2 = new BufferedReader(new FileReader(file2read_json));
            // https://sites.google.com/site/gson/gson-user-guide#TOC-Array-Examples
            Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
            Object obj2 = gson.fromJson(br2, Object.class); // parses json-str into an object
            GsonParseStr(obj2.toString(), (JsonElement) null );
        }  catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
            if (br2 != null)  {
                br2.close();
            }

            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
    static void GsonParseStr(String jsonStr, JsonElement elem)  {
        JsonParser parser2 = new JsonParser();
        elem = parser2.parse(jsonStr);   // this stmt crashes for the blank char 
        System.out.printf("parse str : %s \n", jsonStr);

    }
}
我的文件的内容是:

[{month = august, weather:clear}, [333] , {addr : {place = {city = city_name, county : its_name}, state = "West.Virginia" } } ]
如果我把“西弗吉尼亚”改成“西弗吉尼亚”,程序就会崩溃

该文件的解析方式应与“原始字符串形式的文件内容”相同


PS:正如JPinzon所建议的,我需要在文件中引用(西弗吉尼亚州),我确实有。但他们必须进一步逃脱。因此:(州:“西弗吉尼亚州”)不会这样做;它应该是(州:“西弗吉尼亚州”)。或者,键“State”周围可以有双引号,但这是可选的

尝试将JSON修复为:

[{"month":"august", "weather":"clear"}, [333], {"addr":{"place":{"city":"city_name", "county":"its_name"}, "state":"West Virginia"}}]
。。。或者格式很好:

[
    {
        "month":"august",
        "weather":"clear"
    },
    [
        333
    ],
    {
        "addr":{
            "place":{
                "city":"city_name",
                "county":"its_name"
            },
            "state":"West Virginia"
        }
    }
]

如果进行调试,您将看到字符串
obj2.toString()
不包含“West Virginia”的引号,因为
gson.fromJson(br2,Object.class)
在解析时已将其删除。这就是它崩溃的原因


为了避免此错误,您可以尝试在文件中添加转义引号,例如
state=“\“West Virginia\”

这不是有效的json…首先,您的文件不包含正确的json。另外,log
jsonStr
在崩溃语句查看您从文件中获得的内容之前,您说过如果您传入相同的硬编码字符串,那么它可能会工作,这可能意味着您从文件中获得的字符串是不同的。输入相同的字符串并得到不同的结果是不可能的。我应该补充一点,json.org主页指定key:value作为语法,但是我的文件(当然不是那种格式)有一些key=value结构,Gson同样能很好地处理这些结构。我注意到Gson在一些在线讨论中也正确处理了“=”符号,我自己也尝试过使用它,Gson对此没有任何问题。我做了您建议的更改,现在代码没有崩溃。代码可以解析该文件,即使其中没有双引号,除了“西弗吉尼亚”附近。在这种情况下,引用必须转义。棘手的JSON规范提到了围绕键名的引号(例如“key”:“value”),但即使我删除了引号(key:value),Gson也不会介意。在需要引号的地方,还有一层涉及到引号在外部引号中转义。我刚才告诉过你Gson方法在做什么(在解析时删除引号)以及如何避免错误,但是如果你想用正确的方法来做,你应该修复JSON(正如另一个答案所建议的那样)在解析方法中使用
JsonReader
,而不是在
BufferedReader
中使用
toString()
newjsonreader(newfilereader(file2read_json))
)。