如何修改我的函数以将 json 对象检索到嵌套的 json?
How do I modify my function to retrieve json objects to a nested json?
这是我目前在我的代码中使用的 json :
{"forceDeviceLockout":0,"canStartValue":true,"destructOnRead":[30,60,300]}
我使用以下函数获取 json 值:
private Object getValueForField(Field field) {
if (runtimeConfiguration.has(field.fieldName) && field.updateFromServer) {
try {
Object value = runtimeConfiguration.get(field.fieldName);
if (value instanceof JSONArray) {
JSONArray values = (JSONArray) value;
if (values.get(0) instanceof Number) {
long[] retVals = new long[values.length()];
for (int i = 0; i < values.length(); i++) {
retVals[i] = ((Number) values.get(i)).longValue();
}
return retVals;
}
} else if (value instanceof Number) {
return ((Number) value).longValue();
} else {
return value;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return field.defaultValue;
}
现在,我有一个新的嵌套 json 如下:
{"forceDeviceLockout":0,"canStartValue":true,"destructOnRead":[30,60,300],"NEWVALUE":{"canStartNewValue1":true,"canStartroupValue":true}
在新的 json 中,我添加了嵌套的 json 对象:NEWVALUE,它本身有 2 个对象。
我在 json 方面有点弱,所以不确定如何修改我的代码以检索上述各个值。有什么想法吗?
如果这些 json 键是预定义的,我们可以像这样访问它们
public class SampleModel {
public int forceDeviceLockout;
public boolean canStartValue;
public int[] destructOnRead;
public NestedModel NEWVALUE;
}
public class NestedModel {
public boolean canStartNewValue1;
public boolean canStartroupValue;
}
Gson gson = new Gson();
SampleModel sampleModel = gson.fromJson("{\"forceDeviceLockout\":0,\"canStartValue\":true,\"destructOnRead\":[30,60,300],\"NEWVALUE\":{\"canStartNewValue1\":true,\"canStartroupValue\":true}}",SampleModel.class);
Log.d("canStartNewValue : " ,sampleModel.canStartNewValue)
Log.d("canStartNewValue1 : " , sampleModel.NEWVALUE.canStartNewValue1);
注意:需要添加依赖compile 'com.google.code.gson:gson:2.8.2'
我不知道你为什么搞得这么复杂!但是看看我为你写的这段代码。它可能会给你一个想法:
public void printFieldsValues(Object object){
try{
Field[] fields = object.getClass().getFields();
JSONObject jsonObject = new JSONObject();
for(Field field : fields){
jsonObject.put(field.getName(), field.get(object));
}
JSONObject newValue = new JSONObject("{\"canStartNewValue1\":true,"
+ "\"canStartroupValue\":true}");
jsonObject.put("NEWVALUE", newValue);
printJson(jsonObject);
}catch(Exception e){
e.printStackTrace();
}
}
public void printJson(JSONObject jsonObject) throws JSONException{
Iterator<String> keys = jsonObject.keys();
String key;
while(keys.hasNext()){
key = keys.next();
try{
printJson(new JSONObject(jsonObject.getString(key)));
}catch(Exception e){
Log.d("TAG", "key = " + key);
Log.d("TAG", "value = " + jsonObject.get(key).toString());
}
}
}
在您的主要对象中,您可以这样称呼它:
printFieldsValues(this);
如果您只想修改当前代码以解析收到的 json,您可以添加
if(value instance of JSONObject){
JSONObject jsonObject = (JSONObject) value;
return jsonObject;
}
这是我目前在我的代码中使用的 json :
{"forceDeviceLockout":0,"canStartValue":true,"destructOnRead":[30,60,300]}
我使用以下函数获取 json 值:
private Object getValueForField(Field field) {
if (runtimeConfiguration.has(field.fieldName) && field.updateFromServer) {
try {
Object value = runtimeConfiguration.get(field.fieldName);
if (value instanceof JSONArray) {
JSONArray values = (JSONArray) value;
if (values.get(0) instanceof Number) {
long[] retVals = new long[values.length()];
for (int i = 0; i < values.length(); i++) {
retVals[i] = ((Number) values.get(i)).longValue();
}
return retVals;
}
} else if (value instanceof Number) {
return ((Number) value).longValue();
} else {
return value;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return field.defaultValue;
}
现在,我有一个新的嵌套 json 如下:
{"forceDeviceLockout":0,"canStartValue":true,"destructOnRead":[30,60,300],"NEWVALUE":{"canStartNewValue1":true,"canStartroupValue":true}
在新的 json 中,我添加了嵌套的 json 对象:NEWVALUE,它本身有 2 个对象。
我在 json 方面有点弱,所以不确定如何修改我的代码以检索上述各个值。有什么想法吗?
如果这些 json 键是预定义的,我们可以像这样访问它们
public class SampleModel {
public int forceDeviceLockout;
public boolean canStartValue;
public int[] destructOnRead;
public NestedModel NEWVALUE;
}
public class NestedModel {
public boolean canStartNewValue1;
public boolean canStartroupValue;
}
Gson gson = new Gson();
SampleModel sampleModel = gson.fromJson("{\"forceDeviceLockout\":0,\"canStartValue\":true,\"destructOnRead\":[30,60,300],\"NEWVALUE\":{\"canStartNewValue1\":true,\"canStartroupValue\":true}}",SampleModel.class);
Log.d("canStartNewValue : " ,sampleModel.canStartNewValue)
Log.d("canStartNewValue1 : " , sampleModel.NEWVALUE.canStartNewValue1);
注意:需要添加依赖compile 'com.google.code.gson:gson:2.8.2'
我不知道你为什么搞得这么复杂!但是看看我为你写的这段代码。它可能会给你一个想法:
public void printFieldsValues(Object object){
try{
Field[] fields = object.getClass().getFields();
JSONObject jsonObject = new JSONObject();
for(Field field : fields){
jsonObject.put(field.getName(), field.get(object));
}
JSONObject newValue = new JSONObject("{\"canStartNewValue1\":true,"
+ "\"canStartroupValue\":true}");
jsonObject.put("NEWVALUE", newValue);
printJson(jsonObject);
}catch(Exception e){
e.printStackTrace();
}
}
public void printJson(JSONObject jsonObject) throws JSONException{
Iterator<String> keys = jsonObject.keys();
String key;
while(keys.hasNext()){
key = keys.next();
try{
printJson(new JSONObject(jsonObject.getString(key)));
}catch(Exception e){
Log.d("TAG", "key = " + key);
Log.d("TAG", "value = " + jsonObject.get(key).toString());
}
}
}
在您的主要对象中,您可以这样称呼它:
printFieldsValues(this);
如果您只想修改当前代码以解析收到的 json,您可以添加
if(value instance of JSONObject){
JSONObject jsonObject = (JSONObject) value;
return jsonObject;
}