当前位置: 首页 > 知识库问答 >
问题:

如何仅通过更改Json方法来记录事件数据?

阎德宇
2023-03-14

我有一个Android应用程序。

我已经通过创建一个从应用程序中捕获各种参数 /variable值的方法来捕获事件。我写的代码片段包含EventClass和EventModelClass{公共类UserAccessCase实现ILog{

private Logger mLogger = null;
UserAccessEventModel obj;

public void StoreUserAccessEvent(String Timestamp, String UserId, int FailedAttempts, int SuccessfulAttempts, int Attempts,
                                 int NoOfRevocations, int PassCodeChange) {

    obj = new UserAccessEventModel(Timestamp, UserId,  SuccessfulAttempts, FailedAttempts, Attempts, NoOfRevocations, PassCodeChange);

    toJsonLog();
}

public String toJsonLog() {

    JSONObject event = new JSONObject();

    try {

        event.put("Timestamp", obj.getTimestamp());
        event.put("UserId", obj.userid);
        event.put("SuccessfulAttempts", obj.successfulattempts);
        event.put("FailedAttempts", obj.failedattempts);
        event.put("Attempts", obj.attempts);
        event.put("NoOfRevocations", obj.noofrevocations);
        event.put("PassCodeChange", obj.passcodechange);

        //to store the log data that is stored in json object
        Log.d("UserAccessEvent", event.toString());
        return event.toString();

    } catch (Exception e) {
        Log.d("UserAccessEvent", "Exception");
        throw new RuntimeException(e);

    }
}

}

公共类UserAccessEventModel{

private String timestamp;
public String userid;
public int successfulattempts;
public int failedattempts;
public int attempts;
public int noofrevocations;
public int passcodechange;


public void setTimestamp(String timestamp) {
    this.timestamp = timestamp;
}

public void setUserid(String userid) {
    this.userid = userid;
}

public void setSuccessfulattempts(int successfulattempts) { this.successfulattempts = successfulattempts;   }

public void setFailedattempts(int failedattempts) {
    this.failedattempts = failedattempts;
}

public void setAttempts(int attempts) {
    this.attempts = attempts;
}

public void setNoofrevocations(int noofrevocations) {
    this.noofrevocations = noofrevocations;
}

public void setPasscodechange(int passcodechange) {
    this.passcodechange = passcodechange;
}

public String getTimestamp(){
    timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
    return timestamp;

}

public UserAccessEventModel() {

}

public UserAccessEventModel(String timestamp, String userid, int successfulattempts, int failedattempts, int attempts, int noofrevocations, int passcodechange) {
    this.timestamp = timestamp;
    this.userid = userid;
    this.successfulattempts = successfulattempts;
    this.failedattempts = failedattempts;
    this.attempts = attempts;
    this.noofrevocations = noofrevocations;
    this.passcodechange = passcodechange;
}

}

我想进行更改,这样我就可以只使用JSON来记录数据,而不用使用模型类。我希望它更通用。。。。。

现在,我需要通过更改JSON方法键/值对来记录方法中的数据。

有什么方法可以做到这一点吗??

请给出任何建议。

共有1个答案

司徒良哲
2023-03-14

如果您使用的是Java8,则可以执行以下操作。

public String toJsonLog(Class YourModelClass) {
                JSONObject event = new JSONObject();
                Class yourClass = YourModelClass.class;
                Field[] fields = yourClass.getFields();

                YourModelClass obj = new YourModelClass();

                for(Field f: fields){
                    f.getName();
                }
                try {
                    for(int i=0; i<fields.length(); i++){
                    String geterStr = obj + ".get" + fields[i] + "()";
                        event.put(fields[i], geterStr);
                    }

                    Log.d("YourModelClass", event.toString());
                    return event.toString();

                } catch (Exception e) {
                    Log.d("YourModelClass", "Exception");
                    throw new RuntimeException(e);

                }
            }

但在这个过程中,必须使getter方法与字段名相同。例如,假设你的字段名是userId,那么你必须将getter方法设置为getuserId(),而不是getuserId()。必须忽略java命名约定才能使其通用。

注意:我没有尝试过这个,但我参考了这个问题:如何获取变量名?-java并把我自己的逻辑,但我想它应该可以工作。

 类似资料:
  • 我有一个在事件上触发的可运行文件。我试图从事件中获取列表并清除它,但将列表放在事件期间创建的实体的元数据存储中。到目前为止,我已经尝试过: 注意:这个类实现了一个事件监听器。 和(仅最后一节): 在顶部,它不会清除事件。getDrops()并将把列表放入实体的元数据中,复制事件。getDrops()。在下面的示例中,它将清除事件。getDrops(),但不会将列表放入实体的元数据中,从而擦除事件。

  • 问题内容: 我正在使用Chrome扩展程序,我想检测用户何时键入URL。我知道: 但是,只要URL更改(例如,页面自动重新加载或用户单击链接等),它就会被调用。 我希望能够仅通过用户输入URL来确定URL是否已更改。 问题答案: 您可以使用(MDN)事件获取此信息。事件侦听器接收属性(MDN),该属性根据导航的原因将是不同的值(MDN)。哪个值,您触发将取决于 正是 您所渴望的东西。对于你的描述,

  • 问题内容: 该代码不起作用 问题答案: JavaScript区分大小写。 因此,如果要更改字体大小,则必须执行以下操作:

  • 我需要有关如何更改通过DocuSign向收件人发送电子邮件时显示的名称的帮助。我使用的是REST API,我复制了DocuSign的一个示例。我可以更改电子邮件主题,但我不知道top如何更改电子邮件正文中的[名称]。下面是一个如何更改电子邮件主题的示例。我正在使用c#Web开发。 这些是我想改变的,任何有[名字的东西]: [姓名]通过docusign 提前谢谢你。

  • 我有一个自定义按钮组件,如下所示。 当我点击按钮时,每件事都会例外,按钮文本也在变化。但是当我点击另一个按钮时,我想更改按钮的文本。为此,我调用按钮的onclick方法。但是,当我单击按钮时,即使调用了该方法,文本也不会更改。这是我的页面。