Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java服务器的JSON格式_Java_Json - Fatal编程技术网

Java服务器的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

我正在尝试使用gson将JSON字符串读入Java程序。在下面的示例代码中,Java程序有3个对象类。json字符串中的数据将具有每个类的可变数量的对象实例。我试图创建一个要解析的JSON示例。。但是在解析各种对象时遇到了问题

这是使用json字符串的正确方式,还是可以用不同的方式来实现。。如何使用不同类的变量对象解析json。谢谢

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结构是什么?最大标识符、最大值、最大对象、最大数组

  • 使用texteditor等创建完整的json结构
  • 让我们认为这是我完整的json结构:

    {
      "array": [
        1,
        2,
        3
      ],
      "boolean": true,
      "null": null,
      "number": 123,
      "object": {
        "a": "b",
        "c": "d",
        "e": "f"
      },
      "string": "Hello World"
    }
    
  • 创建与json标识符相同的Java类。您可以使用convert to Java
  • 以下是我的Java类:

    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