当前位置: 首页 > 知识库问答 >
问题:

在RealmDatabase中解析Json时发生IllegalStateException

谷梁云瀚
2023-03-14

我使用数据库领域,我有一个json对象,我需要从文件中解析并保存到数据库。

  {
    "pPID": 1,
    "pName": "myName",
    "pDesc": "myDescription",
    "pTotal": 120,
    "pOrder": 1,
    "puoCompleted": false,
    "puoProgressPercent":0,
    "puoProgressCount":0,
    "pCommercialAccessRule": {
      "tag": "myTag",
      "contents": [
        "string object", "string object"
      ]
    }
  }

问题出现在对象pCommercialAccessRulle中,其中有一个字符串列表,不支持基本类型,这就是我创建对象的原因。

public class RealmString extends RealmObject{

    String string;

    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }
}

在类商业访问规则中,我创建的不是字符串列表,而是对象RealmString列表

public class CommercialAccessRule extends RealmObject implements Serializable {


    private String tag;
    private RealmList<RealmString> contents;

    public CommercialAccessRule() {
    }

    public String getTag() {
        return tag;
    }

    public void setTag(String tag) {
        this.tag = tag;
    }

    public RealmList<RealmString> getContents() {
        return contents;
    }

    public void setContents(RealmList<RealmString> contents) {
        this.contents = contents;
    }

}

但我犯了这样一个错误

Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
at android.util.JsonReader.expect(JsonReader.java:310) at android.util.JsonReader.beginObject(JsonReader.java:293)
at io.realm.RealmStringRealmProxy.createUsingJsonStream(RealmStringRealmProxy.java:136) at io.realm.CommercialAccessRuleRealmProxy.createUsingJsonStream(CommercialAccessRuleRealmProxy.java:390) at io.re    
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRINGalm.PDataRealmProxy.createUsingJsonStream(PDataRealmProxy.java:525) at io.realm.DefaultRealmModuleMediator.createUsingJsonStream(DefaultRealmModuleMediator.java:257) at io.realm.Realm.createAllFromJson(Realm.java:435)

搜索之后,我去了那里,然后又去了那里,但不知道如何在这里实现它:

InputStream stream = null;
    try {
        stream = getApplicationContext().getAssets().open("test_pdata.json");
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        realm.beginTransaction();
        realm.createAllFromJson(PData.class, stream);
        realm.commitTransaction();
    } catch (IOException e) {
        realm.cancelTransaction();
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

这是我上面写的类PDate, json。

public class PData extends RealmObject implements Serializable{

    private static final String TAG = PData.class.getSimpleName();

    private String pName;
    private String pDesc;
    private boolean puoCompleted;
    private int pPID;
    private int pTotal;
    private int pOrder;
    private  int puoProgressCount;
    private int puoProgressPercent;
    private CommercialAccessRule pCommercialAccessRule;
    private String originalJson;

    public PData() {
    }


    public String getpName() {
        return pName;
    }

    public void setpName(String pName) {
        this.pName = pName;
    }

    public String getpDesc() {
        return pDesc;
    }

    public void setpDesc(String pDesc) {
        this.pDesc = pDesc;
    }

    public boolean ispuoCompleted() {
        return puoCompleted;
    }

    public void setpuoCompleted(boolean puoCompleted) {
        this.puoCompleted = puoCompleted;
    }

    public int getpPID() {
        return pPID;
    }

    public void setpPID(int pPID) {
        this.pPID = pPID;
    }

    public int getpTotal() {
        return pTotal;
    }

    public void setpTotal(int pTotal) {
        this.pTotal = pTotal;
    }

    public int getpOrder() {
        return pOrder;
    }

    public void setpOrder(int pOrder) {
        this.pOrder = pOrder;
    }

    public int getpuoProgressCount() {
        return puoProgressCount;
    }

    public void setpuoProgressCount(int puoProgressCount) {
        this.puoProgressCount = puoProgressCount;
    }

    public int getPuoProgressPercent() {
        return puoProgressPercent;
    }

    public void setPuoProgressPercent(int puoProgressPercent) {
        this.puoProgressPercent = puoProgressPercent;
    }

    public CommercialAccessRule getCommercialAccessRule() {
        return pCommercialAccessRule;
    }

    public void setpCommercialAccessRule(CommercialAccessRule pCommercialAccessRule) {
        this.pCommercialAccessRule = pCommercialAccessRule;
    }

    public String getOriginalJson() {
        return originalJson;
    }

    public void setOriginalJson(String originalJson) {
        this.originalJson = originalJson;
    }




    @Override
    public String toString() {
        return "PData{" +
                "pName='" + pName + '\'' +
                ", pDesc='" + pDesc + '\'' +
                ", puoCompleted=" + puoCompleted +
                ", pPID=" + pPID +
                ", pTotal=" + pTotal +
                ", pOrder=" + pOrder +
                ", puoProgressCount=" + puoProgressCount +
                ", puoProgressPercent=" + puoProgressPercent +
                ", pCommercialAccessRule=" + pCommercialAccessRule +
                ", originalJson='" + originalJson + '\'' +
                '}';
    }

}

共有2个答案

宰父霖
2023-03-14

遵循以下步骤:

>

JsonHelper类将JsonObject转换为map。

4.用你得到的值更新你的领域对象。

//对不起,我解释得不好。

//使用这个类可以转换json数据

复制自https://gist.github.com/codebutler/2339666

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.*;

public class JsonHelper {
public static Object toJSON(Object object) throws JSONException {
    if (object instanceof Map) {
        JSONObject json = new JSONObject();
        Map map = (Map) object;
        for (Object key : map.keySet()) {
            json.put(key.toString(), toJSON(map.get(key)));
        }
        return json;
    } else if (object instanceof Iterable) {
        JSONArray json = new JSONArray();
        for (Object value : ((Iterable)object)) {
            json.put(value);
        }
        return json;
    } else {
        return object;
    }
}

public static boolean isEmptyObject(JSONObject object) {
    return object.names() == null;
}

public static Map<String, Object> getMap(JSONObject object, String key) throws JSONException {
    return toMap(object.getJSONObject(key));
}

public static Map<String, Object> toMap(JSONObject object) throws JSONException {
    Map<String, Object> map = new HashMap();
    Iterator keys = object.keys();
    while (keys.hasNext()) {
        String key = (String) keys.next();
        map.put(key, fromJson(object.get(key)));
    }
    return map;
}

public static List toList(JSONArray array) throws JSONException {
    List list = new ArrayList();
    for (int i = 0; i < array.length(); i++) {
        list.add(fromJson(array.get(i)));
    }
    return list;
}

private static Object fromJson(Object json) throws JSONException {
    if (json == JSONObject.NULL) {
        return null;
    } else if (json instanceof JSONObject) {
        return toMap((JSONObject) json);
    } else if (json instanceof JSONArray) {
        return toList((JSONArray) json);
    } else {
        return json;
     }
  }
}

//在将jsonObject传递给上述类的活动中,您将获得Map/Arraylist

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

   Map<String,Object> convertedData = new HashMap<>();
   // pass the jsonResponse to JsonHelperClass
    convertedData = toMap(jsonObject);

    //upadte your realm object
    your_realm_object.updateWithJsonData(convertedData);

     }
 }

 //realmObject class
public YourRealm extends RealmObject{

 String name;
 String id;
 String desc;
// setters and getters

//update realm Object with json data
 public void updateWithJsonData(Map<String,Object> data){

  setName(data.get("pName"));
  setId(data.get("pPID"));
  //......
  }
}
常子濯
2023-03-14

如果想为元素创建JSON对象,请使用GSON。为此。

狐狸前:

RealmObject obj  = new RealmObject();
obj.setpPID(1);
obj.setpName("myName");
obj.setpDesc(myDescription");
obj.setpTotal(120);
obj.setpOrder(1);
obj.setpuoCompleted(false);
obj.setpuoProgressPercent(0);
obj.setpuoProgressCount(0);
CommercialAccessRule innerobj = new CommercialAccessRule();
innerobj.setTag("myTag");
List<String> strList = new ArrayList<>();
strList.add("string object");
strList.add("string object");
obj.setpCommercialAccessRule(innerobj);
Gson gson = new Gson();
String JSONString = gson.toJson(obj);
RealmObject obj1 = gson.fromJson(JSONString,RealmObject.class);

JSONString的结果将是

{“pPID”:1,“pName”:“myName”,“pDesc”:“myDescription”,“pTotal”:120,“pOrder”:1,“puoCompleted”:false,“puoProgressPercent”:0,“puoProgressCount”:0,“pCommercialAccessRule”:{“tag”:“myTag”,“contents”:[“string object”,“string object”]}

用这个来验证你的JSON:https://jsonformatter.curiousconcept.com/

 类似资料:
  • 我正在解析下面的json,并希望获取EnterpriseFlag的值

  • 问题内容: 我有以下JSON字符串: 如何在PHP中解析它并提取s 列表? 问题答案: 您可以使用该函数来解析PHP中的JSON数据(至少=> 5.2.0)。一旦有了PHP对象,就可以轻松地遍历所有配方/成员并使用以下内容访问其标题: (对不起,我现在无法真正运行此代码。希望无论如何它都会有所帮助。)

  • 问题内容: 我在解析Json文件时遇到问题。尝试解析一个Json文件: 这是我为其定义的两个结构。 暂停结构: AttachedModel模型结构: 然后,我为其创建一个键和一个函数: 在功能上: 这是输出 问题是,即使有数据,该行也始终为假,并且转到“ 有人可以告诉我这里的问题在哪里吗? 问题答案: 为您的json创建此模型类: 然后,您可以像这样解析它:

  • 问题内容: 我想解析JavaScript中的JSON字符串。响应就像 我怎样才能获得的值,并从这个? 问题答案: 在JavaScript中解析JSON的标准方法是 该API是在ES5(2011)中引入的,此后按市场份额和Node.js在超过99%的浏览器中已实现。它的用法很简单: 唯一无法使用的时间是您是否在为旧版浏览器编程,例如IE 7(2006),IE 6(2001),Firefox 3(20

  • 问题内容: 是否可以解析的? 我不是要创建一个字符串。相反,我想解析作为传入的字符串。 问题答案: 更新:从SQL Server 2016开始 ,现在可以在TSQL中解析JSON了。 在本地,没有任何支持。您必须使用CLR。就这么简单,除非您有巨大的受虐行为并且想要用SQL编写JSON解析器 通常,人们要求从数据库中获取JSON输出,并且互联网上有一些示例。但是进入数据库?

  • 问题内容: 我正在尝试解析json请求中的Datetime。该请求看起来像这样: 它被解码成的结构看起来像这样: 解码行如下所示: Revel返回此错误: 根据此处的revel文档,https://revel.github.io/manual/parameters.html 在同一文档中,他们还说您可以附加如下格式: 为了验证格式是否在数组中,我尝试了以下方法: 在绝望的最后一幕中,我尝试以rev