我曾经拥有这种简单的JSON数据,并且可以成功解析属性并将其保存到SQLite数据库中。
[
{
"project_title" : " ",
"organization_title" : " ",
"website": "",
"address": "",
"keyword" : "",
"short_code" : "",
"project_description" : "",
"smallImageUrl" : "",
"bigImageUrl" : "",
"price" : "",
"country" : "",
"donationAmount" : "",
"categories" : "",
"campaign_id" : "",
"currency_isoname": "",
"paypal_email" : "",
"elv_available" : ""
}
]
但现在我有了一些更复杂的JSON文件:
[
{
"location": {
"deleted_at": "null",
"documentary_video_length": "81",
"id": "15",
"latitude": "52.4134145988286",
"longitude": "13.0904620846177",
"position": "5",
"updated_at": "2011-08-26T15:30:27+02:00",
"name": "Glienicker Br\u00fccke",
"text": "",
"documentary_video_url": "",
"documentary_thumbnail_url": "",
"audio_text_url": "",
"footages": [
{
"id": "31",
"latitude": "52.4134145988286",
"longitude": "13.0904620846177",
"position": "12",
"name": "Glienicker Br\u00fccke 1933",
"text": "sdcs",
"thumbnail_url": "",
"video_url": "",
"video_length": "2",
"time_period": {
"id": "24",
"name": "1933"
}
},
{
"id": "32",
"latitude": "52.4134145988286",
"longitude": "13.0904620846177",
"position": "12",
"name": "Glienicker Br\u00fccke 1985",
"text": "fvd",
"thumbnail_url": "",
"video_url": "",
"video_length": 35,
"time_period": {
"id": 30,
"name": "1985"
}
},
{
"id": "33",
"latitude": "52.4134145988286",
"longitude": "13.0904620846177",
"position": "12",
"name": "Glienicker Br\u00fccke 1989",
"text": "fghg",
"thumbnail_url": "",
"video_url": "",
"video_length": "41",
"time_period": {
"id": "12",
"name": "1989"
}
}
]
}
}
]
这些是我以前必须解析JSON并将其属性保存到SQLite数据库中的类。
IntentService类
public class Sync extends IntentService {
public Sync() {
super("Sync");
}
@Override
protected void onHandleIntent(Intent intent) {
Database.OpenHelper dbhelper = new Database.OpenHelper(getBaseContext());
SQLiteDatabase db = dbhelper.getWritableDatabase();
DefaultHttpClient httpClient = new DefaultHttpClient();
db.beginTransaction();
HttpGet request = new HttpGet(
"https://....");
try {
HttpResponse response = httpClient.execute(request);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
InputStream instream = response.getEntity().getContent();
BufferedReader r = new BufferedReader(new InputStreamReader(
instream, "UTF-8"), 8000);
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
total.append(line);
}
instream.close();
String bufstring = total.toString();
JSONArray arr = new JSONArray(bufstring);
Database.Tables tab = Database.Tables.AllTables
.get(Database.Project.NAME);
tab.DeleteAll(db);
for (int i = 0; i < arr.length(); i++) {
tab.InsertJSON(db, (JSONObject) arr.get(i));
}
db.setTransactionSuccessful();
}
} catch (Exception e) {
e.printStackTrace();
}
db.endTransaction();
db.close();
getContentResolver().notifyChange(
Uri.withAppendedPath(Provider.CONTENT_URI,
Database.Project.NAME), null);
}
}
SQLite数据库类
public class Database {
final OpenHelper openHelper;
static final String DATABASE_NAME = "mydb";
static final int DATABASE_VERSION = 6;
public Database(Context context) throws Exception {
openHelper = new OpenHelper(context);
}
public void Destroy() {
openHelper.close();
}
public static enum ColumnsTypes {
integer, varchar, guid, datetime, numeric
};
static final String COLLATE = "COLLATE LOCALIZED";
static final String EMPTY = "";
public static interface Project {
public static final String NAME = "Project";
public static String C_PROJECTTITLE = "project_title";
public static String C_ORGANIZATIONTITLE = "organization_title";
public static String C_WEBSITE = "website";
public static String C_ADDRESS = "address";
public static String C_KEYWORD = "keyword";
public static String C_SHORTCODE = "short_code";
public static String C_PROJECTDESCRIPTION = "project_description";
public static String C_SMALLIMAGE = "smallImageUrl";
public static String C_BIGIMAGE = "bigImageUrl";
public static String C_PRICE = "price";
public static String C_COUNTRY = "country";
public static String C_DONATIONAMOUNT = "donationAmount";
public static String C_CATEGORIES = "categories";
public static String C_CAMPAIGNID = "campaign_id";
public static String C_PAYPALEMAIL = "paypal_email";
public static String C_ELVAVAILABLE = "elv_available";
public static String C_CURRENCY = "currency_isoname";
public final static String[] C = new String[] { C_PROJECTTITLE,
C_ORGANIZATIONTITLE, C_WEBSITE, C_ADDRESS, C_KEYWORD, C_SHORTCODE,
C_PROJECTDESCRIPTION, C_SMALLIMAGE, C_BIGIMAGE, C_PRICE,
C_COUNTRY, C_DONATIONAMOUNT, C_CATEGORIES, C_CAMPAIGNID, C_PAYPALEMAIL, C_ELVAVAILABLE, C_CURRENCY };
public final static ColumnsTypes[] CT = new ColumnsTypes[] {
ColumnsTypes.varchar, ColumnsTypes.varchar,
ColumnsTypes.varchar, ColumnsTypes.varchar,
ColumnsTypes.varchar, ColumnsTypes.varchar,
ColumnsTypes.varchar, ColumnsTypes.varchar,
ColumnsTypes.varchar,ColumnsTypes.varchar, ColumnsTypes.varchar,
ColumnsTypes.varchar,ColumnsTypes.varchar,
ColumnsTypes.varchar,ColumnsTypes.varchar, ColumnsTypes.varchar, ColumnsTypes.varchar};
public final static boolean[] CN = new boolean[] { false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false,false };
public final static String[] CS = new String[] { COLLATE, COLLATE,
COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE };
}
public static class Tables {
String[] columns = null;
ColumnsTypes[] columnsTypes = null;
String[] columnsSpecials = null;
String name = null;
boolean[] columnsNullable = null;
Tables(String name, String[] columns, ColumnsTypes[] columnsTypes,
String[] columnsSpecials, boolean[] columnsNullable) {
this.name = name;
this.columns = columns;
this.columnsTypes = columnsTypes;
this.columnsSpecials = columnsSpecials;
this.columnsNullable = columnsNullable;
}
public String DropStatment() {
return "DROP TABLE IF EXISTS " + name;
}
public void DeleteAll(SQLiteDatabase db) {
db.delete(name, null,null);
}
public long InsertJSON(SQLiteDatabase db, JSONObject obj)
throws JSONException {
ContentValues vals = new ContentValues();
for (String col : columns) {
vals.put(col, obj.getString(col));
}
return db.insert(name, null, vals);
}
public String CreateStatment() {
StringBuilder sb = new StringBuilder("CREATE TABLE ");
sb.append(name);
sb.append(" ([");
for (int i = 0; i < columns.length; i++) {
sb.append(columns[i]);
sb.append("] ");
sb.append(columnsTypes[i].name());
sb.append(' ');
sb.append(columnsSpecials[i]);
if (!columnsNullable[i])
sb.append(" NOT NULL ");
sb.append(", [");
}
sb.append("_id] INTEGER PRIMARY KEY AUTOINCREMENT);");
return sb.toString();
}
public final static Map<String, Tables> AllTables;
static {
HashMap<String, Tables> aMap = new HashMap<String, Tables>();
aMap.put(Project.NAME, new Tables(Project.NAME, Project.C,
Project.CT, Project.CS, Project.CN));
AllTables = Collections.unmodifiableMap(aMap);
}
}
public static class OpenHelper extends SQLiteOpenHelper {
public OpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
for (Tables table : Tables.AllTables.values()) {
String create = table.CreateStatment();
db.execSQL(create);
}
} catch (Exception e) {
Log.e("Exception", e.toString());
}
}
public OpenHelper Recreate() {
onUpgrade(getWritableDatabase(), 1, 2);
return this;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
for (Tables table : Tables.AllTables.values()) {
db.execSQL(table.DropStatment());
}
onCreate(db);
}
}
}
ContentProvider类
public class Provider extends ContentProvider {
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
return 0;
}
private static final int PROJECTS = 1;
private static final int PROJECT = 2;
public static final String PROJECTS_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
+ "/Project";
public static final String PROJECT_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE
+ "/Project";
public static final String AUTHORITY = "spendino.de";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
static final HashMap<String, String> map = new HashMap<String, String>();
static {
matcher.addURI(AUTHORITY, "Project", PROJECTS);
matcher.addURI(AUTHORITY, "Project/#", PROJECT);
map.put(BaseColumns._ID, BaseColumns._ID);
map.put(Database.Project.C_BIGIMAGE, Database.Project.C_BIGIMAGE);
map.put(Database.Project.C_COUNTRY, Database.Project.C_COUNTRY);
map.put(Database.Project.C_KEYWORD, Database.Project.C_KEYWORD);
map.put(Database.Project.C_ORGANIZATIONTITLE,
Database.Project.C_ORGANIZATIONTITLE);
map.put(Database.Project.C_PRICE, Database.Project.C_PRICE);
map.put(Database.Project.C_PROJECTDESCRIPTION,
Database.Project.C_PROJECTDESCRIPTION);
map.put(Database.Project.C_PROJECTTITLE,
Database.Project.C_PROJECTTITLE);
map.put(Database.Project.C_SHORTCODE, Database.Project.C_SHORTCODE);
map.put(Database.Project.C_SMALLIMAGE, Database.Project.C_SMALLIMAGE);
map.put(Database.Project.C_DONATIONAMOUNT, Database.Project.C_DONATIONAMOUNT);
map.put(Database.Project.C_WEBSITE, Database.Project.C_WEBSITE);
map.put(Database.Project.C_ADDRESS, Database.Project.C_ADDRESS);
map.put(Database.Project.C_CATEGORIES, Database.Project.C_CATEGORIES);
map.put(Database.Project.C_CAMPAIGNID, Database.Project.C_CAMPAIGNID);
map.put(Database.Project.C_PAYPALEMAIL, Database.Project.C_PAYPALEMAIL);
map.put(Database.Project.C_ELVAVAILABLE, Database.Project.C_ELVAVAILABLE);
map.put(Database.Project.C_CURRENCY, Database.Project.C_CURRENCY);
}
@Override
public String getType(Uri uri) {
switch (matcher.match(uri)) {
case PROJECTS:
return PROJECTS_MIME_TYPE;
case PROJECT:
return PROJECT_MIME_TYPE;
default:
throw new IllegalArgumentException("Unknown URL " + uri);
}
}
@Override
public Uri insert(Uri arg0, ContentValues arg1) {
// TODO Auto-generated method stub
return null;
}
private Database.OpenHelper mDB;
@Override
public boolean onCreate() {
try {
mDB = new Database.OpenHelper(getContext());
} catch (Exception e) {
Log.e("Exception", e.getLocalizedMessage());
return false;
}
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
switch (matcher.match(uri)) {
case PROJECTS:
String table = uri.getPathSegments().get(0);
builder.setTables(table);
break;
case PROJECT:
table = uri.getPathSegments().get(0);
builder.setTables(table);
selection = "_id=?";
selectionArgs = new String[] { uri.getPathSegments().get(1) };
break;
default:
throw new IllegalArgumentException("Unknown URL " + uri);
}
builder.setProjectionMap(map);
Cursor cursor = builder.query(mDB.getReadableDatabase(), projection, selection,
selectionArgs, null, null, sortOrder);
if (cursor == null) {
return null;
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
public int update(Uri uri, ContentValues cv, String selection, String[] selectionArgs) {
String table = null;
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
switch (matcher.match(uri)) {
case PROJECTS:
table = uri.getPathSegments().get(0);
builder.setTables(table);
break;
case PROJECT:
table = uri.getPathSegments().get(0);
builder.setTables(table);
selection = "_id=?";
selectionArgs = new String[] { uri.getPathSegments().get(1) };
break;
default:
throw new IllegalArgumentException("Unknown URL " + uri);
}
return mDB.getWritableDatabase().update(table, cv, selection, selectionArgs);
}
}
为了使新的JSON文件被解析并保存到SQLite数据库中,我需要对上述类进行哪些更改?
我在这里发言是因为旧的JSON文件上没有Array,但我想重用已经拥有的类。我知道我需要根据SQLite数据库和提供程序类上的JSON属性更改列名称并自定义字符串
谢谢
参考方案
您可以使用Gson或Jackson。这些库使您可以轻松解析/生成JSON输入/输出,从而构建类“beans”。
例如在Gson中,如果您有一个用以下方式构建的名为Car的类:
class Car{
int wheels;
String plate;
}
...并且您想解析一系列汽车,可以通过以下方式轻松地将JSON充气:
Gson gson = new Gson();
List<Car> cars = gson.fromJson(input, new TypeToken<List<Car>>(){}.getType());
非常酷的事情是,它能够理解您包含的数组可以毫无问题地解析(我指的是您的输入)。
干杯,
西蒙妮
在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…
在Java中使用新关键字和直接赋值的字符串 - javaString s="hi"; String s1=new String("hi"); 从内存角度看,s和s1存储在哪里?无论是在堆内存还是堆栈中。s指向“ hi”,而s1指向hi存在的内存位置?请帮忙? 参考方案 考虑以下 String s = "hi"; String s1 = new Strin…
Java Globbing模式以匹配目录和文件 - java我正在使用递归函数遍历根目录下的文件。我只想提取*.txt文件,但不想排除目录。现在,我的代码如下所示:val stream = Files.newDirectoryStream(head, "*.txt") 但是这样做将不会匹配任何目录,并且返回的iterator()是False。我使用的是Mac,所以我不想包含的噪音文件是.DS_ST…
Java RegEx中的单词边界\ b - java我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…
如何转义将成为字符串一部分的斜线? - java我很难找到一种方法来逃避这些引用,String key = StringUtils.substringBetween(html, "class=\"category_keyword\"", ">"); 特别是这部分:"class=\"category_keyword…