gpt4 book ai didi

java解释简单表达式

转载 作者:行者123 更新时间:2023-11-29 03:27:50 24 4
gpt4 key购买 nike

当我们使用 gson 将 java bean 转换为 json 字符串时,我想扩展 Gson 库以启用字段级自定义翻译。

像这样:

@Convert(expression="if(#value == '1') then 'enabled' else 'disabled'")
private String roleStatus;

如何在java中实现这样的表达式解释器? spring 表达式可以做到这一点吗?

最佳答案

例如你的json如下:

{
"roleStatus" : "3"
"role" : "guest"
}

<强>1。首先需要创建Converter注解字段级别为

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Target(ElementType.FIELD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface Convertor {

String expression();
}

<强>2。然后用JsonDeserializer解析gson自定义级别反序列化

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import org.mvel2.MVEL;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;

public class RoleStatusDeserializer implements JsonDeserializer<RoleStatus> {

@Override
public RoleStatus deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {

final JsonObject jsonObject = json.getAsJsonObject();

// get roleStatus from jsonObject and populate new roleStatus object
final RoleStatus roleStatus = new RoleStatus(jsonObject.get("roleStatus").getAsString());

final String expression = getFiledAnnotationValue();
// Evaluate expression via Mvel.
final String result = (String) MVEL.eval(expression, roleStatus);
// update statusRole
roleStatus.setRoleStatus(result);

return roleStatus;
}

/**
* reading Filed level annotation via java reflection
* @return annoation value
*/
private String getFiledAnnotationValue() {

String expression = null;
for (Field field : RoleStatus.class.getDeclaredFields()) {

final Annotation annotation = field.getAnnotation(Convertor.class);

if (annotation instanceof Convertor) {
field.setAccessible(true);
Convertor convertorAnnotation = (Convertor) annotation;
expression = convertorAnnotation.expression();
field.setAccessible(false);
}
}

return expression;
}
}

<强>3。使用 java 反射在 RoleStatusDeserializer#deserialize() 中获取注释值(表达式)

4.获得注释表达式值后,您必须使用 MVEL 计算表达式值

MVEL 是一种用于基于 Java 的应用程序的强大表达语言,大多数开源应用程序都使用 mvel 来表示 el,例如 spring、warp-persist 等。您可以从Mvel site 下载Mvel 最新版本。

<强>5。最后解析为

JsonReader reader = new JsonReader(new FileReader("your_path"));
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(RoleStatus.class,new RoleStatusDeserializer());
Gson gson = gsonBuilder.create();
RoleStatus roleStatus = gson.fromJson(reader, RoleStatus.class);

关于java解释简单表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20062688/

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