Java服务器的JSON格式
我正在尝试使用gson将JSON字符串读入Java程序。在下面的示例代码中,Java程序有3个对象类。json字符串中的数据将具有每个类的可变数量的对象实例。我试图创建一个要解析的JSON示例。。但是在解析各种对象时遇到了问题 这是使用json字符串的正确方式,还是可以用不同的方式来实现。。如何使用不同类的变量对象解析json。谢谢Java服务器的JSON格式,java,json,Java,Json,我正在尝试使用gson将JSON字符串读入Java程序。在下面的示例代码中,Java程序有3个对象类。json字符串中的数据将具有每个类的可变数量的对象实例。我试图创建一个要解析的JSON示例。。但是在解析各种对象时遇到了问题 这是使用json字符串的正确方式,还是可以用不同的方式来实现。。如何使用不同类的变量对象解析json。谢谢 package newpackage; import java.util.ArrayList; import com.google.gson.Gson; pub
package newpackage;
import java.util.ArrayList;
import com.google.gson.Gson;
public class jsonsample {
public static void main(String[] args) {
String jsonstring = "{'TableA':[{'field_A1':'A_11'},{'field_A1':'A_12'}]}"
+ ",{'TableB':[{'field_B1':'B_11','field_B2':'B_12','field_B3':['abc','def','ghi']},"
+ "{'field_B1':'B_21','field_B2':'B_Field22','field_B3':['mno','pqr','xyz']}]"
+ ",{'TableC':[{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'},"
+ "{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'},{'field_C1':'C_31','field_C2':'C_32','field_C3':'C_33'}]}";
jsonstring = jsonstring.replace('\'', '"');
}
public class TableA {
String field_A1;
public TableA(String a){
this.field_A1 = a;
}
@Override
public String toString() {
return ("Table A" + " " + this.field_A1);
}
}
public class TableB {
String field_B1;
String field_B2;
ArrayList<String> field_B3 = new ArrayList<String>();
public TableB(String a, String b, ArrayList<String> c){
this.field_B1 = a;
this.field_B2 = b;
this.field_B3 = c;
}
@Override
public String toString() {
return ("Table B" + " " + this.field_B1+ " " + this.field_B2);
}
}
public class TableC {
String field_C1;
String field_C2;
String field_C3;
public TableC(String a, String b, String c){
this.field_C1 = a;
this.field_C2 = b;
this.field_C3 = c;
}
@Override
public String toString() {
return ("Table C" + " " + this.field_C1 + " " + this.field_C2 + " " + this.field_C3);
}
}
package-newpackage;
导入java.util.ArrayList;
导入com.google.gson.gson;
公共类jsonsample{
公共静态void main(字符串[]args){
String jsonstring=“{'TableA':[{'field_A1':'A_11'},{'field_A1':'A_12'}]}”
+“,{'TableB':[{'field_B1':'B_11','field_B2':'B_12','field_B3':['abc','def','ghi']”
+“{'field_B1':'B_21','field_B2':'B_Field22','field_B3':['mno','pqr','xyz']}”
+“,{'TableC':[{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'”
+“{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'},{'field_C1':'C_31','field_C2':'C_32','field_C3':'C_33'}”;
jsonstring=jsonstring.replace(“\”,“”);
}
公共类表格{
字符串字段_A1;
公共表a(字符串a){
该场_A1=a;
}
@凌驾
公共字符串toString(){
返回(“表A”+“”+此字段_A1);
}
}
公共类表格B{
字符串字段_B1;
字符串字段_B2;
ArrayList字段_B3=新的ArrayList();
公共表b(字符串a、字符串b、数组列表c){
该字段_B1=a;
该字段_B2=b;
该字段_B3=c;
}
@凌驾
公共字符串toString(){
返回(“表B”+“”+此.field_B1+“”+此.field_B2);
}
}
公共类表格C{
字符串字段_C1;
字符串字段_C2;
字符串字段_C3;
公共表c(字符串a、字符串b、字符串c){
该场_C1=a;
该场_C2=b;
该字段_C3=c;
}
@凌驾
公共字符串toString(){
返回(“表C”+“”+this.field\uC1+“”+this.field\uC2+“”+this.field\uC3);
}
}
}我觉得您的JSON字符串不正确。让我提出以下建议:
public static void main(String args[]) {
String jsonstring = "["
+ "{'TableA':[{'field_A1':'A_11'},{'field_A1':'A_12'}]}"
+ ",{'TableB':[{'field_B1':'B_11','field_B2':'B_12','field_B3':['abc','def','ghi']},"
+ "{'field_B1':'B_21','field_B2':'B_Field22','field_B3':['mno','pqr','xyz']}]}"
+ ",{'TableC':[{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'},"
+ "{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'},{'field_C1':'C_31','field_C2':'C_32','field_C3':'C_33'}]}"
+ "]";
jsonstring = jsonstring.replace('\'', '"');
Gson gson = new Gson();
JsonParser parser = new JsonParser();
JsonArray array = parser.parse(jsonstring).getAsJsonArray();
for (JsonElement jsonElement : array) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
Map.Entry<String,JsonElement> table = jsonObject.entrySet().iterator().next();
String tableName = table.getKey();
JsonElement rows = table.getValue();
try {
Class<?> rowClass = Class.forName("[Lnewpackage." + tableName + ";"); // explanation see below this code snippet
// rowClass is an array class!
Object[] parsedRows = gson.fromJson(rows, rowClass);
// do something with parsedRows
for (Object x : parsedRows) {
System.out.println(x);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
publicstaticvoidmain(字符串参数[]){
字符串jsonstring=“[”
+“{'TableA':[{'field_A1':'A_11'},{'field_A1':'A_12'}]}”
+“,{'TableB':[{'field_B1':'B_11','field_B2':'B_12','field_B3':['abc','def','ghi']”
+“{'field_B1':'B_21','field_B2':'B_Field22','field_B3':['mno','pqr','xyz']}”
+“,{'TableC':[{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'”
+“{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'},{'field_C1':'C_31','field_C2':'C_32','field_C3':'C_33'}”
+ "]";
jsonstring=jsonstring.replace(“\”,“”);
Gson Gson=新的Gson();
JsonParser=新的JsonParser();
JsonArray数组=parser.parse(jsonstring.getAsJsonArray();
for(JsonElement JsonElement:array){
JsonObject=jsonElement.getAsJsonObject();
Map.Entry table=jsonObject.entrySet().iterator().next();
字符串tableName=table.getKey();
JsonElement行=table.getValue();
试一试{
Class rowClass=Class.forName(“[Lnewpackage.+tableName+”;”);//解释请参见下面的代码段
//rowClass是一个数组类!
Object[]parsedRows=gson.fromJson(行,行类);
//用ParseDroos做点什么
for(对象x:parsedRows){
系统输出println(x);
}
}catch(classnotfounde异常){
e、 printStackTrace();
}
}
}
假设“表定义”包含一个名为类的属性,该属性包含表中的对象,对象作为该属性的数组值
类.forName(“[Lnewpackage.+tableName+”;”)的解释
这将检索位于包
newpackage
中的类的数组类型的类实例,例如newpackage.TableA[]
(注意[]
)。Class.forName(“a”)
返回表示类的实例a
类。forName([LA;”)返回表示类的实例A
s数组的“类”。将其用作fromJson(…)
的参数,可解析A-objects的JSON数组。首先,您必须确定基本JSON结构是什么?最大标识符、最大值、最大对象、最大数组
{
"array": [
1,
2,
3
],
"boolean": true,
"null": null,
"number": 123,
"object": {
"a": "b",
"c": "d",
"e": "f"
},
"string": "Hello World"
}
public class Object
{
public string a { get; set; }
public string c { get; set; }
public string e { get; set; }
}
public class RootObject
{
public ArrayList<int> array { get; set; }
public Boolean boolean { get; set; }
public Object @null { get; set; }
public int number { get; set; }
public Object @object { get; set; }
public string @string { get; set; }
}
对于Json
Gson gson = new GsonBuilder().setDateFormat("dd/MM/yyyy").create();
String json = gson.toJson(obj);
这是基于@hurricane suggestion的代码
package newpackage;
import java.util.List;
import com.google.gson.*;
public class jsonsample {
public static void main(String[] args) throws ClassNotFoundException {
String jsonstring = "{'TableA':["
+ "{'field_A1':'A_11'},"
+ "{'field_A1':'A_12'}"
+ "],"
+ "'TableB':["
+ "{'field_B1':'B_11','field_B2':'B_12','field_B3':['abc','def']},"
+ "{'field_B1':'B_21','field_B2':'B_22','field_B3':['mno','xyz']}"
+ "],"
+ "'TableC':["
+ "{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'},"
+ "{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'}"
+ "]}";
jsonstring = jsonstring.replace('\'', '"');
RootObject root = new GsonBuilder().create().fromJson(jsonstring, RootObject.class);
for (int i=0; i < root.TableA.size(); i++){
System.out.println(root.TableA.get(i));
}
for (int i=0; i < root.TableB.size(); i++){
System.out.println(root.TableB.get(i));
}
for (int i=0; i < root.TableC.size(); i++){
System.out.println(root.TableC.get(i));
}
}
public class TableA
{
public String field_A1;
@Override
public String toString() {
return ("Table A" + " " + this.field_A1);
}
}
public class TableB{
public String field_B1;
public String field_B2;
public List<String> field_B3;
@Override
public String toString() {
return ("Table B" + " " + this.field_B1 + " " + this.field_B2 + " " + this.field_B3);
}
}
public class TableC{
public String field_C1;
public String field_C2;
public String field_C3;
@Override
public String toString() {
return ("Table C" + " " + this.field_C1 + " " + this.field_C2 + " " + this.field_C3);
}
}
public class RootObject{
public List<TableA> TableA;
public List<TableB> TableB;
public List<TableC> TableC;
}
}
它工作得非常好。谢谢。如果你能解释一下使用这种格式的原因,我将不胜感激:Class.forName(“[Lnewpackage.+tableName+”;”);不客气:-)添加了一个解释,希望能澄清一些问题。谢谢@hurricane。这也非常有效。我将在下面的回答中添加代码。
package newpackage;
import java.util.List;
import com.google.gson.*;
public class jsonsample {
public static void main(String[] args) throws ClassNotFoundException {
String jsonstring = "{'TableA':["
+ "{'field_A1':'A_11'},"
+ "{'field_A1':'A_12'}"
+ "],"
+ "'TableB':["
+ "{'field_B1':'B_11','field_B2':'B_12','field_B3':['abc','def']},"
+ "{'field_B1':'B_21','field_B2':'B_22','field_B3':['mno','xyz']}"
+ "],"
+ "'TableC':["
+ "{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'},"
+ "{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'}"
+ "]}";
jsonstring = jsonstring.replace('\'', '"');
RootObject root = new GsonBuilder().create().fromJson(jsonstring, RootObject.class);
for (int i=0; i < root.TableA.size(); i++){
System.out.println(root.TableA.get(i));
}
for (int i=0; i < root.TableB.size(); i++){
System.out.println(root.TableB.get(i));
}
for (int i=0; i < root.TableC.size(); i++){
System.out.println(root.TableC.get(i));
}
}
public class TableA
{
public String field_A1;
@Override
public String toString() {
return ("Table A" + " " + this.field_A1);
}
}
public class TableB{
public String field_B1;
public String field_B2;
public List<String> field_B3;
@Override
public String toString() {
return ("Table B" + " " + this.field_B1 + " " + this.field_B2 + " " + this.field_B3);
}
}
public class TableC{
public String field_C1;
public String field_C2;
public String field_C3;
@Override
public String toString() {
return ("Table C" + " " + this.field_C1 + " " + this.field_C2 + " " + this.field_C3);
}
}
public class RootObject{
public List<TableA> TableA;
public List<TableB> TableB;
public List<TableC> TableC;
}
}
Table A A_11
Table A A_12
Table B B_11 B_12 [abc, def]
Table B B_21 B_22 [mno, xyz]
Table C C_11 C_12 C_13
Table C C_21 C_22 C_23