Java 无法强制转换为json

Java 无法强制转换为json,java,json,eclipse,Java,Json,Eclipse,我对json非常陌生,我在下面举了一个例子, 尽管我面临一些问题,但我也在尝试以一种好的方式解析它 我将Eclipse与: JRE系统库[Java1.8]和使用库: json-simple-1.1.1.jar 我制作了以下JSON文件: [ [ { "TestScenario_1": { "Transaction": "A", "description": "This is a test A", "Co-no": "",

我对json非常陌生,我在下面举了一个例子, 尽管我面临一些问题,但我也在尝试以一种好的方式解析它

我将Eclipse与:
JRE系统库[Java1.8]
和使用库:
json-simple-1.1.1.jar

我制作了以下JSON文件:

[
  [
    {
      "TestScenario_1": {
        "Transaction": "A",
        "description": "This is a test A",
        "Co-no": "",
        "Project": "Proj1"
      }
    }
  ],
  [
    {
      "TestScenario_2": {
        "Transaction": "B",
        "description": "This is a test B",
        "Co-no": "",
        "Project": "Proj2"
      }
    }
  ]
]
这是我尝试读取文件的脚本

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonParseTest {

    private static final String filePath = "C:\\temp\\mytest2.json";

    @SuppressWarnings({ "unchecked", "unused", "rawtypes" })
    public static void main(String[] args) {

        try {


            // read the json file
            FileReader reader = new FileReader(filePath);

            JSONParser jsonParser = new JSONParser();
            JSONObject jo = (JSONObject) jsonParser.parse(reader);

            // get a String from the JSON object
            Long TestScenario=(Long) jo.get("TestScenario");
            System.out.println("TestScenario " + TestScenario);

            String Transaction=(String) jo.get("Transaction");
            System.out.println("Transaction " + Transaction);

            String Description=(String) jo.get("Description");
            System.out.println("Description " + Description);

            String Cono=(String) jo.get("Co-no");
            System.out.println("Co-no " + Cono);

            JSONArray Parameters= (JSONArray) jo.get("Parameters");


        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ParseException ex) {
            ex.printStackTrace();
        } catch (NullPointerException ex) {
            ex.printStackTrace();
        }

    }

}
虽然我得到以下错误:

Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject
    at JsonParseTest.main(JsonParseTest.java:25)

有人能帮我吗

先谢谢你

[
  {
  "TestScenario_1": {
    "Transaction": "A",
    "description": "This is a test A",
    "Co-no": "",
    "Project": "Proj1"
  }
 },
  {
  "TestScenario_2": {
    "Transaction": "B",
    "description": "This is a test B",
    "Co-no": "",
    "Project": "Proj2"
  }
 }
]
然后

`


使用for循环来迭代JSONArray…我只是给出一个示例

一个简单的方法可能是递归json字符串方法,在java中是json数组和带有instanceof方法的对象

因此,需要两种方法,一种用于json数组

private static void searchJSONArray(JSONArray arry) {
    JSONArray jarry = arry;
    JSONObject jobj = null;

    for (Iterator iter = jarry.iterator(); iter.hasNext();) {
        Object o = iter.next();
        if (o instanceof JSONArray) {
            searchJSONArray((JSONArray) o);
        } else if (o instanceof JSONObject) {
            jobj = (JSONObject) o;
            Set keyset = jobj.keySet();

            for (Iterator iter2 = keyset.iterator(); iter2.hasNext();) {
                String key = (String) iter2.next();
                Object value = jobj.get(key);

                if(value instanceof JSONObject)
                {
                    System.out.println("[" + key + "]");
                    searchJSONObject((JSONObject)value);
                }
                else
                {
                    System.out.println(key + "=" + (String)value);
                }
            }
        }

    }
}
另一个用于json对象

private static void searchJSONObject(JSONObject obj) {
    JSONObject jobj = obj;

    Set keyset = jobj.keySet();

    for (Iterator iter2 = keyset.iterator(); iter2.hasNext();) {
        String key = (String) iter2.next();
        Object value = jobj.get(key);

        if(value instanceof JSONObject)
        {
            searchJSONObject((JSONObject)value);
        }
        else
        {
            System.out.println(key + "=" + (String)value);
        }
    }

}
然后,完整的来源如下

package com.tobee.tests.parse.json;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonParseTest {

    private static final String filePath = "resource/aa/mytest2.json";

    private static void searchJSONObject(JSONObject obj) {
        JSONObject jobj = obj;

        Set keyset = jobj.keySet();

        for (Iterator iter2 = keyset.iterator(); iter2.hasNext();) {
            String key = (String) iter2.next();
            Object value = jobj.get(key);

            if(value instanceof JSONObject)
            {
                searchJSONObject((JSONObject)value);
            }
            else
            {
                System.out.println(key + "=" + (String)value);
            }
        }

    }

    private static void searchJSONArray(JSONArray arry) {
        JSONArray jarry = arry;
        JSONObject jobj = null;

        for (Iterator iter = jarry.iterator(); iter.hasNext();) {
            Object o = iter.next();
            if (o instanceof JSONArray) {
                searchJSONArray((JSONArray) o);
            } else if (o instanceof JSONObject) {
                jobj = (JSONObject) o;
                Set keyset = jobj.keySet();

                for (Iterator iter2 = keyset.iterator(); iter2.hasNext();) {
                    String key = (String) iter2.next();
                    Object value = jobj.get(key);

                    if(value instanceof JSONObject)
                    {
                        System.out.println("[" + key + "]");
                        searchJSONObject((JSONObject)value);
                    }
                    else
                    {
                        System.out.println(key + "=" + (String)value);
                    }
                }
            }

        }
    }

    public static void main(String[] args) {

        try {

            // read the json file
            FileReader reader = new FileReader(filePath);

            JSONParser jsonParser = new JSONParser();

            Object jsonThing = jsonParser.parse(reader);

            if (jsonThing instanceof JSONArray) {
                searchJSONArray((JSONArray) jsonThing);
            } else if (jsonThing instanceof JSONObject) {
                JSONObject jobj = (JSONObject) jsonThing;

                Set keyset = jobj.keySet();

                for (Iterator iter2 = keyset.iterator(); iter2.hasNext();) {
                    String key = (String) iter2.next();
                    String value = (String) jobj.get(key);

                    System.out.println(key + "=" + value);

                }
            }

        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ParseException ex) {
            ex.printStackTrace();
        } catch (NullPointerException ex) {
            ex.printStackTrace();
        }

    }

    @SuppressWarnings({ "unchecked", "unused", "rawtypes" })
    public static void your_main(String[] args) {

        try {

            // read the json file
            FileReader reader = new FileReader(filePath);

            JSONParser jsonParser = new JSONParser();
            JSONObject jo = (JSONObject) jsonParser.parse(reader);

            // get a String from the JSON object
            Long TestScenario = (Long) jo.get("TestScenario");
            System.out.println("TestScenario " + TestScenario);

            String Transaction = (String) jo.get("Transaction");
            System.out.println("Transaction " + Transaction);

            String Description = (String) jo.get("Description");
            System.out.println("Description " + Description);

            String Cono = (String) jo.get("Co-no");
            System.out.println("Co-no " + Cono);

            JSONArray Parameters = (JSONArray) jo.get("Parameters");

        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ParseException ex) {
            ex.printStackTrace();
        } catch (NullPointerException ex) {
            ex.printStackTrace();
        }

    }

}
输出在这里

[TestScenario_1]
Co-no=
Project=Proj1
Transaction=A
description=This is a test A
[TestScenario_2]
Co-no=
Project=Proj2
Transaction=B
description=This is a test B
将json修复为:

[{
    "Transaction": "A",
    "Description": "This is a test A",
    "Co-no": "",
    "Project": "Proj1"
},
{
    "Transaction": "B",
    "Description": "This is a test B",
    "Co-no": "",
    "Project": "Proj2"
}]
并使用以下内容更改您的实现:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.Map;

public class JsonParseTest {

    private static final String FILE_PATH = "C:\\temp\\mytest2.json";

    public static void main(String[] args) {

        try (InputStream source = Files.newInputStream(Paths.get(FILE_PATH), StandardOpenOption.READ)) {
            ObjectMapper mapper = new ObjectMapper();
            mapper.enable(SerializationFeature.INDENT_OUTPUT);

            // read the json file
            List<Map> jo = mapper.readValue(source, List.class);
            jo.forEach((elem) -> {
                System.out.println("Transaction " + elem.get("Transaction"));
                System.out.println("Description " + elem.get("Description"));
                System.out.println("Co-no " + elem.get("Co-no"));
                System.out.println("Project " + elem.get("Project"));
                System.out.println("***************************************");
            });

            String jsonStr = mapper.writeValueAsString(jo);
            System.out.println("Json content\n" + jsonStr);
        } catch (IOException | NullPointerException ex) {
            ex.printStackTrace();
        }

    }

}

问题:

文件内容为JSONArray类型

[
  [
    {
      "TestScenario_1": {
        "Transaction": "A",
        "description": "This is a test A",
        "Co-no": "",
        "Project": "Proj1"
      }
    }
  ],
  [
    {
      "TestScenario_2": {
        "Transaction": "B",
        "description": "This is a test B",
        "Co-no": "",
        "Project": "Proj2"
      }
    }
  ]
]
但在第24行

它试图以
JSONObject
的形式获取数据(jo),因此发生了
ClassCastException

解决方案:

  • jo对象的类型更改为JSONArray。
JSONArray jo=(JSONArray)jsonParser.parse(reader);
  • 或者通过保留该数组的父级来更改文件内容
{ [ { “TestScenario_1”:{ “交易”:“A”, “说明”:“这是测试a”, “产地来源证号码”:“, “项目”:“Proj1” } } ], [ { “测试场景2”:{ “交易”:“B”, “说明”:“这是测试B”, “产地来源证号码”:“, “项目”:“项目2” } } ] }
您可以使用ObjectMapper,而不是JSONParser。使用ObjectMapper,您可以执行mapper.readValue(reader,Map.class),它生成一个包含从您的文件读取的所有信息的映射。它定义了一个对象数组,而不是对象数组。请注意,您没有关闭您创建的文件读取器。处理流的一个优雅的解决方案是使用try with resources功能,这将关闭作为资源实例化的流。我通过使用更改获得以下输出:TestScenario null Transaction null description null Co no null将“TestScenario”更改为“TestScenario\u 1”我在线程“main”中获得以下错误异常java.lang.ClassCastException:org.json.simple.JSONObject无法在JsonParseTest.main(JsonParseTest.java:27)上转换为java.lang.Long。请参见示例:我正在进行一些编辑,而您在其间进行了一些尝试,请立即尝试……如果any@Xsi,祝你有愉快的一天~~也祝你快乐!
Transaction A
Description This is a test A
Co-no 
Project Proj1
***************************************
Transaction B
Description This is a test B
Co-no 
Project Proj2
***************************************
Json content
[ {
  "Transaction" : "A",
  "Description" : "This is a test A",
  "Co-no" : "",
  "Project" : "Proj1"
}, {
  "Transaction" : "B",
  "Description" : "This is a test B",
  "Co-no" : "",
  "Project" : "Proj2"
} ]
[
  [
    {
      "TestScenario_1": {
        "Transaction": "A",
        "description": "This is a test A",
        "Co-no": "",
        "Project": "Proj1"
      }
    }
  ],
  [
    {
      "TestScenario_2": {
        "Transaction": "B",
        "description": "This is a test B",
        "Co-no": "",
        "Project": "Proj2"
      }
    }
  ]
]
JSONObject jo = (JSONObject) jsonParser.parse(reader);
JSONArray jo = (JSONArray) jsonParser.parse(reader); { [ { "TestScenario_1": { "Transaction": "A", "description": "This is a test A", "Co-no": "", "Project": "Proj1" } } ], [ { "TestScenario_2": { "Transaction": "B", "description": "This is a test B", "Co-no": "", "Project": "Proj2" } } ] }