【问题标题】:gson + json paring errorgson + json 解析错误
【发布时间】:2015-04-28 05:08:50
【问题描述】:

我正在尝试像这样使用 gson 解析 JSON 对象:

1st,2nd,3rd,4th

Gson gson=new Gson(); 

Map<String, HashSet<String>> map = new HashMap<String, HashSet<String>>();

map = (Map<String, HashSet<String>>) gson.fromJson(jsonTxt, map.getClass());

这就是 JSON 的样子:

"{
  \"Rao\":[\"Q7293658\",\"\",\"Q7293657\",\"Q12953055\",\"Q3531237\",\"Q4178159\",\"Q1138810\",\"Q579515\",\"Q3365064\",\"Q7293664\",\"Q1133815\"],
  \"Hani Durzy\":[\"\"],
  \"Louise\":[\"\",\"Q1660645\",\"Q130413\",\"Q3215140\",\"Q152779\",\"Q233203\",\"Q7871343\",\"Q232402\",\"Q82547\",\"Q286488\",\"Q156723\",\"Q3263649\",\"Q456386\",\"Q233192\",\"Q14714149\",\"Q12125864\",\"Q57669\",\"Q168667\",\"Q141410\",\"Q166028\"],
  \"Reyna\":[\"Q7573462\",\"Q2892895\",\"Q363257\",\"Q151944\",\"Q3740321\",\"Q2857439\",\"Q1453358\",\"Q7319529\",\"Q733716\",\"Q16151941\",\"Q7159448\",\"Q5484172\",\"Q6074271\",\"Q1753185\",\"Q7319532\",\"Q5171205\",\"Q3183869\",\"Q1818527\",\"Q251862\",\"Q3840414\",\"Q5271282\",\"Q5606181\"]
}"

我不断收到错误:

Expected BEGIN_OBJECT but was STRING at line 1 column 2

我认为这与它以" 开头的事实没有任何关系,正如他们在this question 中所建议的那样,因为当我删除第一个和最后一个引号时,我得到了错误Expected name at line 2 column 3

我的完整代码是here on my github page,它很短。

我实际上是在尝试反转this procedureThis 是一个相关问题。

更新

        File f = new File("/home/matthias/Workbench/SUTD/nytimes_corpus/wdtk-parent/wdtk-examples/JSON_Output/user.json");

        String jsonTxt = null;

        if (f.exists())
        {
            InputStream is = new FileInputStream("/home/matthias/Workbench/SUTD/nytimes_corpus/wdtk-parent/wdtk-examples/JSON_Output/user.json");
            jsonTxt = IOUtils.toString(is);

        }

        Gson json = new Gson();
        Map<String, HashSet<String>> map = new HashMap<String, HashSet<String>>();
        map = (Map<String, HashSet<String>>) json.fromJson(jsonTxt, map.getClass());
        System.out.println(map);

【问题讨论】:

  • 浏览我的答案。
  • 我知道你找到了解决方案。但可以尝试我的从文件中读取 JSON 的版本。
  • @OO7 我在我古怪的转义 JSON 上尝试了它,我得到了错误 com.google.gson.JsonPrimitive cannot be cast to com.google.gson.JsonObject,当我在普通 JSON 上尝试它时(在我删除转义和外部引号之后)它可以工作,但是那只是将其作为字符串读入吗?我想以Map&lt;String, HashSet&lt;String&gt;&gt; 的形式加入
  • @OO7 但是您在文件中读取的方式比我聪明得多,我采用了您的那部分代码。

标签: java json gson


【解决方案1】:

您已经转义了所有 " 字符并将整个 JSON 用引号括起来,就好像这是您的代码中的 String 常量(也许它曾经存在过)。但是您的 JsonMapFileExample 正在从磁盘上的文件中读取此 JSON - 没有理由在专用 JSON 文件中转义引号。

尝试删除外部" 字符每个键和值周围的\ 转义。您还可以将您的 JSON 直接粘贴到任意数量的在线 JSON validators 中以进行仔细检查。您的文件内容应该是有效的 JSON;你粘贴的不是。

【讨论】:

  • 是的。你完全正确。好极了。我不知道为什么我在外面有所有这些转义字符或引号,我想现在我需要编写一个简短的脚本来删除那些废话。我用this file 生成了 JSON 对象,你能告诉我为什么它会添加到额外的废话中吗?
  • 我在您的链接中看不到任何会输出这样的源代码转义文本的内容。你确定这是产生拙劣输出的原因吗?
  • 您是否曾经使用过Escaper?我还没有尝试过,但看起来这个类会像你所拥有的那样返回转义的 JSON。
【解决方案2】:

根据您遇到的错误,您需要从 Json 字符串中删除 ",以便 gson 正确解析它。

例如,对于您的 json 字符串,更正后的字符串是:

{
  \"Rao\":[\"Q7293658\",\"\",\"Q7293657\",\"Q12953055\",\"Q3531237\",\"Q4178159\",\"Q1138810\",\"Q579515\",\"Q3365064\",\"Q7293664\",\"Q1133815\"],
  \"Hani Durzy\":[\"\"],
  \"Louise\":[\"\",\"Q1660645\",\"Q130413\",\"Q3215140\",\"Q152779\",\"Q233203\",\"Q7871343\",\"Q232402\",\"Q82547\",\"Q286488\",\"Q156723\",\"Q3263649\",\"Q456386\",\"Q233192\",\"Q14714149\",\"Q12125864\",\"Q57669\",\"Q168667\",\"Q141410\",\"Q166028\"],
  \"Reyna\":[\"Q7573462\",\"Q2892895\",\"Q363257\",\"Q151944\",\"Q3740321\",\"Q2857439\",\"Q1453358\",\"Q7319529\",\"Q733716\",\"Q16151941\",\"Q7159448\",\"Q5484172\",\"Q6074271\",\"Q1753185\",\"Q7319532\",\"Q5171205\",\"Q3183869\",\"Q1818527\",\"Q251862\",\"Q3840414\",\"Q5271282\",\"Q5606181\"]
}

【讨论】:

  • 我需要删除我的 json 字符串中的每个 " 实例还是只删除开头和结尾的那个?
  • 没有。只需删除第一个和最后一个实例。
  • 我不认为这是原因,我只是尝试过,我得到了Expected name at line 2 column 3
  • 我不确定。但是答案中指定的字符串对我有用。
【解决方案3】:

试试这个

public class JsonTest {

    private String  jsonTxt = "{\"Rao\":[\"Q7293658\",\"\",\"Q7293657\",\"Q12953055\",\"Q3531237\","
                    + "\"Q4178159\",\"Q1138810\",\"Q579515\",\"Q3365064\",\"Q7293664\",\"Q1133815\"],"
                    + "\"Hani Durzy\":[\"\"],\"Louise\":[\"\",\"Q1660645\",\"Q130413\",\"Q3215140\","
                    + "\"Q152779\",\"Q233203\",\"Q7871343\",\"Q232402\",\"Q82547\",\"Q286488\","
                    + "\"Q156723\",\"Q3263649\",\"Q456386\",\"Q233192\",\"Q14714149\",\"Q12125864\""
                    + ",\"Q57669\",\"Q168667\",\"Q141410\",\"Q166028\"],\"Reyna\":[\"Q7573462\","
                    + "\"Q2892895\",\"Q363257\",\"Q151944\",\"Q3740321\",\"Q2857439\",\"Q1453358\","
                    + "\"Q7319529\",\"Q733716\",\"Q16151941\",\"Q7159448\",\"Q5484172\",\"Q6074271\""
                    + ",\"Q1753185\",\"Q7319532\",\"Q5171205\",\"Q3183869\",\"Q1818527\",\"Q251862\","
                    + "\"Q3840414\",\"Q5271282\",\"Q5606181\"]}";

    @SuppressWarnings("unchecked")
    @Test
    public void testJson() {
        Gson json = new Gson();
        Map<String, HashSet<String>> map = new HashMap<String, HashSet<String>>();
        map = (Map<String, HashSet<String>>) json.fromJson(jsonTxt, map.getClass());
        System.out.println(map);
    }
}

输出:

{
Reyna=[Q7573462, Q2892895, Q363257, Q151944, Q3740321, Q2857439, Q1453358, Q7319529, Q733716, Q16151941, Q7159448, Q5484172, Q6074271, Q1753185, Q7319532, Q5171205, Q3183869, Q1818527, Q251862, Q3840414, Q5271282, Q5606181], 

Rao=[Q7293658, , Q7293657, Q12953055, Q3531237, Q4178159, Q1138810, Q579515, Q3365064, Q7293664, Q1133815], 

Louise=[, Q1660645, Q130413, Q3215140, Q152779, Q233203, Q7871343, Q232402, Q82547, Q286488, Q156723, Q3263649, Q456386, Q233192, Q14714149, Q12125864, Q57669, Q168667, Q141410, Q166028], 

Hani Durzy=[]
}

通过更新,我了解到您正在尝试从文件中读取 JSON。我有我的版本可以从文件中读取 JSON。检查一下。

private static JsonObject   chartJson;

public static String readChartJsonFromJsonFile(String fileName) {
    try {
        JsonParser jsonParser = new JsonParser();

        // get json as buffer
        BufferedReader br = new BufferedReader(new FileReader(fileName));

        JsonElement element = jsonParser.parse(br);
        if (!(element instanceof JsonNull)) {
            chartJson = (JsonObject) element;
        }
    } catch (FileNotFoundException e) {
        LoggerManager.fatal("Error reading JSON from file.", JsonFileParser.class.getName());
    }
    return chartJson.toString();
}

我在文件中的 JSON 示例:

{
   "xArray":[
      "1 Jan 2008",
      "1 Jan 2009",
      "1 Jan 2010",
      "1 Jan 2011",
      "1 Jan 2012",
      "1 Jan 2013",
      "1 Jan 2014"
   ],
   "yArray":[
      "38",
      "87",
      "45",
      "25",
      "67",
      "-37",
      "98"
   ]
}

【讨论】:

  • 我尝试了我刚刚在更新中发布的代码,但仍然无法正常工作。 :/ 会发生什么?我仍然收到Expected BEGIN_OBJECT but was STRING at line 1 column 2
猜你喜欢
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多