Java 无法强制转换为json
我对json非常陌生,我在下面举了一个例子, 尽管我面临一些问题,但我也在尝试以一种好的方式解析它 我将Eclipse与: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": "",
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。
- 或者通过保留该数组的父级来更改文件内容
您可以使用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"
}
}
]
}