gpt4 book ai didi

java - json 到 java 对象自定义解析器

转载 作者:行者123 更新时间:2023-11-30 11:14:05 25 4
gpt4 key购买 nike

是否有任何自定义 JSON 到 java 对象解析器通过一些配置将 json 属性映射到 Java 对象属性。

假设我有课

class Person { String id; String name; String loc;}

我的json字符串是

{name:"xy",id:12, address: {location: "abc"}}

我需要将 json 的 location.address 映射到 Personloc 属性。我们需要通过配置 XML 或 prop 文件来驱动这个映射。

已编辑....

我正在尝试在属性文件中定义语法或规则比如:

address.location = loc
id = id
name = name

这就是我的想法。不确定如何映射复杂类型,如 List、Map 等

所以我的代码会调用一个方法

Person p = ObjectMapper.map(jsonData,Person.class,configuration)

实际映射是这样完成的

class ObjectMapper {
public static <T> T map(String jsonData,Class<T> rootType, Map<String,String> rules) {

T object = rootType.newInstance();
// TODO: code to parse json using the rules
//and finally return object

return (T) object;
}

这就是我打算做的。任何帮助表示赞赏。提前致谢。

最佳答案

使用下面的代码。

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class Test {

public static void main(String... args) throws Exception{
Map<String, String> rules = new HashMap<>();
rules.put("address.location", "loc");
rules.put("name", "name");
rules.put("id", "id");

String jsonData = "{name:'xy',id:'12', address: {location: 'abc'}, phones: ['a', 'b', 'c']}";

Person person = (Person) map(jsonData, Person.class, rules);
System.out.println(new Gson().toJson(person));
}

public static Object map(String jsonData, Class<?> rootType, Map<String, String> rules) throws Exception{
Map<String, Object> genericMap = new HashMap<>();
Type type = new TypeToken<Map<String, Object>>() {}.getType();
genericMap = new Gson().fromJson(jsonData, type);

Object object = rootType.newInstance();

for (Map.Entry<String, String> entry : rules.entrySet()){
String mapKey = entry.getKey();
String mapValue = entry.getValue();

String keys[] = mapKey.split("\\.");
Map<String, Object> obj = null;
if(keys.length > 1){
obj = (Map<String, Object>) genericMap.get(keys[0]);
for(int i=1;i<keys.length-1;i++){
obj = (Map<String, Object>) obj.get(keys[i]);
}
// Method method = object.getClass().getDeclaredMethod("set" + capitalize(mapValue) , String.class);
// method.invoke(object, (String)obj.get(keys[keys.length-1]));
Field field = object.getClass().getDeclaredField(mapValue);
field.set(object, obj.get(keys[keys.length - 1]));
}else{
// Method method = object.getClass().getDeclaredMethod("set" + capitalize(mapValue) , String.class);
// method.invoke(object, (String)genericMap.get(mapValue));

Field field = object.getClass().getDeclaredField(mapValue);
field.set(object, genericMap.get(mapValue));
}
}
return object;
}

public static String capitalize(String line){
return Character.toUpperCase(line.charAt(0)) + line.substring(1);
}
}

class Person {
String id;
String name;
String loc;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getLoc() {
return loc;
}

public void setLoc(String loc) {
this.loc = loc;
}

}

输出

{"id":"12","name":"xy","loc":"abc","phones":["a","b","c"]}

详情

  • 用过Gson API。
  • 此代码适用于 n 号引用对象(如 a.b.c.item)。
  • 您的类应该包含每个字段的 getter/setter。
  • Rules 和 POJO 的字段名称应该匹配。

关于java - json 到 java 对象自定义解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26102905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com