【问题标题】:com.google.gson.JsonSyntaxException:Expected STRING but was BEGIN_ARRAYcom.google.gson.JsonSyntaxException:预期为字符串,但为 BEGIN_ARRAY
【发布时间】:2017-08-18 06:00:46
【问题描述】:

请帮我获取 bom 属性中的子节点列表

JSON 文件

[  
 {  
  "subConfigId":"bac",
  "totalPrice":"634.00",
  "bom":{  
     "ucid":"ucid",
     "type":"RootNode",
     "attributes":{  
        "visible":true,
        "price_status":"SUCCESS"
     },
     "subnodes":[  
        {  
           "description":"Enterprise Shock Rack",
           "ucid":"ucid"
        },
        {  
           "description":"SVC",
           "ucid":"ucid"
        }
     ]
  },
  "breakdown":{  
     "SV":550.0,
     "HW":6084.0
  },
  "currency":"USD"
 }
]

GsonNodes.java

 import java.io.FileReader;
 import java.io.IOException;
 import java.util.Iterator;
 import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonParser;

  public class GsonNodes {
  public static void main(String[] args) throws IOException {   

    try{                 
     JsonElement je = new JsonParser().parse(new FileReader(
             "C:/Desktop/json.txt"));
     JsonArray ja = je.getAsJsonArray();
     Iterator itr = ja.iterator();

     while(itr.hasNext()){
         JsonElement je1 = (JsonElement) itr.next();
         Gson gson = new Gson();
         Details details = gson.fromJson(je1, Details.class);          

         System.out.println(details.getSubConfigId());
         System.out.println(details.getCurrency());
         System.out.println(details.getBreakdown());
         System.out.println(details.getTotalPrice());
         System.out.println(details.getBom().getUcid());         

     }
  } catch (Exception e) {
  e.printStackTrace();
  }
}
}

Details.java POJO

    import java.io.Serializable;
    import java.util.Map;
    public class Details implements Serializable{

        private String subConfigId;
        private String totalPrice;
        private Bom bom;     
        private String currency;
        private Map<String, String> breakdown;

        public String getSubConfigId() {
            return subConfigId;
        }
        public void setSubConfigId(String subConfigId) {
            this.subConfigId = subConfigId;
        }
        public String getTotalPrice() {
            return totalPrice;
        }
        public void setTotalPrice(String totalPrice) {
            this.totalPrice = totalPrice;
        }
        public Bom getBom() {
            return bom;
        }
        public void setBom(Bom bom) {
            this.bom = bom;
        }
        public String getCurrency() {
            return currency;
        }
        public void setCurrency(String currency) {
            this.currency = currency;
        }
        public Map<String, String> getBreakdown() {
            return breakdown;
        }
        public void setBreakdown(Map<String, String> breakdown) {
            this.breakdown = breakdown;
        }
    }

Bom.java

    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;

    public class Bom implements Serializable{

        private String ucid;
        private String type;
        private Map<String, String> attributes;
        private List<Subnodes> subnodes = new ArrayList<Subnodes>();  

        public String getUcid() {
            return ucid;
        }
        public void setUcid(String ucid) {
            this.ucid = ucid;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public Map<String, String> getAttributes() {
            return attributes;
        }
        public void setAttributes(Map<String, String> attributes) {
            this.attributes = attributes;
        }   

        @Override
        public String toString(){
            return getUcid() + ", "+getType()+", "+getAttributes();
        }

    }

子节点.java

    import java.io.Serializable;
    import java.util.Map;

    public class Subnodes implements Serializable{

        private String description;
        private String ucid;
        private Map<String, String> attributes;

        public String getDescription() {
            return description;
        }
        public void setDescription(String description) {
            this.description = description;
        }
        public String getUcid() {
            return ucid;
        }
        public void setUcid(String ucid) {
            this.ucid = ucid;
        }
        public Map<String, String> getAttributes() {
            return attributes;
        }
        public void setAttributes(Map<String, String> attributes) {
            this.attributes = attributes;
        }   
    }

当我尝试获取“子节点”时出现错误 我在类中添加了以下代码

  private List<Subnodes> subnodes = new ArrayList<Subnodes>();

然后我收到错误“预期为字符串,但为 BEGIN_ARRAY”

请帮助我如何获取“子节点”列表

【问题讨论】:

    标签: java parsing exception gson pojo


    【解决方案1】:

    在 Bom.java 中

    请添加 getter/setter 方法:

    private List<Subnodes> subnodes = new ArrayList<Subnodes>();
    
    public List<Subnodes> getSubnodes() {
        return subnodes;
    }
    
    public void setSubnodes(List<Subnodes> subnodes) {
        this.subnodes = subnodes;
    }
    

    我已经尝试如下..这工作正常。

    package com.brp.mvc.util;
    
    import java.io.IOException;
    import java.util.Iterator;
    
    import com.google.gson.Gson;
    import com.google.gson.JsonArray;
    import com.google.gson.JsonElement;
    import com.google.gson.JsonParser;
    
    public class GsonNodes {
        public static void main(String[] args) throws IOException {
    
            try {
                JsonElement je = new JsonParser().parse("[{\"subConfigId\":\"bac\",\"totalPrice\":\"634.00\",\"bom\":{\"ucid\":\"ucid\",\"type\":\"RootNode\",\"attributes\":{\"visible\":true,\"price_status\":\"SUCCESS\"},\"subnodes\":[{\"description\":\"Enterprise Shock Rack\",\"ucid\":\"ucid\"},{\"description\":\"SVC\",\"ucid\":\"ucid\"}]},\"breakdown\":{\"SV\":550.0,\"HW\":6084.0},\"currency\":\"USD\"}]");
                JsonArray ja = je.getAsJsonArray();
                Iterator itr = ja.iterator();
    
                while (itr.hasNext()) {
                    JsonElement je1 = (JsonElement) itr.next();
                    Gson gson = new Gson();
                    Details details = gson.fromJson(je1, Details.class);
    
                    System.out.println(details.getSubConfigId());
                    System.out.println(details.getCurrency());
                    System.out.println(details.getBreakdown());
                    System.out.println(details.getTotalPrice());
                    System.out.println(details.getBom().getUcid());
                    System.out.println(details.getBom().getSubnodes().get(0).getDescription());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    【讨论】:

    • 我尝试过,但出现以下错误 java.lang.IllegalStateException: Expected STRING but was BEGIN_ARRAY at com.google.gson.internal.bind.JsonTreeReader.nextString(JsonTreeReader.java:154)com。 google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:349)
    • 你能分享完整的stackTrace吗?
    • 感谢 patel.. 如何像这样转换 "[{\"subConfigId\":\"bac\",\"totalPrice\""
    • 无需转换为字符串 .. 它也可以像您一样使用 json 文件。它可能是依赖问题......我在依赖下面使用.. com.google.code.gsongson2.1
    • 它也可能文件问题..请尝试创建新的json文件
    【解决方案2】:

    我添加了一种将 json 转换为字符串的方法,如下所示:

        public static String readFile(String filename) {
            String result = "";
            try {
                BufferedReader br = new BufferedReader(new FileReader(filename));
                StringBuilder sb = new StringBuilder();
                String line = br.readLine();
                while (line != null) {
                    sb.append(line);
                    line = br.readLine();
                }
                result = sb.toString();
            } catch(Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    

    并使用如下方法:

                JsonElement je = new JsonParser().parse(readFile("C:/Desktop/json.txt"));
    

    【讨论】:

      猜你喜欢
      • 2013-05-10
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多