java后台解析json并保存到数据库_解析JSON并将其保存在SQLite数据库中 - java

我曾经拥有这种简单的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 AllTables;

static {

HashMap aMap = new HashMap();

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 map = new HashMap();

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 cars = gson.fromJson(input, new TypeToken>(){}.getType());

非常酷的事情是,它能够理解您包含的数组可以毫无问题地解析(我指的是您的输入)。

干杯,

西蒙妮

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…在Java中使用新关键字和直接赋值的字符串 - java

String 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…

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值