gpt4 book ai didi

java - BigDecimal 值反序列化的问题

转载 作者:行者123 更新时间:2023-12-01 12:49:01 25 4
gpt4 key购买 nike

我正在使用 jsefa 0.9.2 来反序列化 CSV 数据。在此期间,我遇到了 BigeDecimal 数据的问题。当您在数字之间传递字母时。反序列化只是忽略字母后面的值并返回数值不会引发任何错误。我预料到了不兼容的错误。有什么建议来解决这个问题吗?下面给出的代码示例。

FoEg“123.3q21”变为 123.3

org.jsefa 杰瑟法 0.9.2

    package com.jsefa;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import org.jsefa.common.validator.BigDecimalValidator;
import org.jsefa.csv.annotation.CsvDataType;
import org.jsefa.csv.annotation.CsvField;

@SuppressWarnings("serial")
@CsvDataType()
public class Person implements Serializable {

public static final String csvHeading = "Name,BirthDate,Weight";
@CsvField(pos = 1)
String name;

@CsvField(pos = 2, format = "dd.MM.yyyy")
Date birthDate;

@CsvField(pos = 3, validatorType = BigDecimalValidator.class)
BigDecimal weight;

public Person() {

}

public Person(String name, Date birthDate, BigDecimal weight) {
this.name = name;
this.birthDate = birthDate;
this.weight = weight;
}

public String getName() {
return name;
}

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

public Date getBirthDate() {
return birthDate;
}

public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}

public BigDecimal getWeight() {
return weight;
}

public void setWeight(BigDecimal weight) {
this.weight = weight;
}

@Override
public String toString() {
return "Person [name=" + name + ", birthDate=" + birthDate + ", weight=" + weight + "]";
}
}




package com.jsefa;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import org.jsefa.csv.CsvDeserializer;
import org.jsefa.csv.CsvIOFactory;
import org.jsefa.csv.config.CsvConfiguration;

public class CSVDeSerTest {

public CSVDeSerTest() {
}

public static void main(String[] args) {
System.out.println("*********** CsvDeserializer *****************");
String p = "Person,12.06.2014,123.3q21";
List<Person> pList = deserializeSites(p.getBytes());
System.out.println("Person:" + '\n' + pList);
}

private static List<Person> deserializeSites(byte[] buffer) {
List<Person> returnList = new ArrayList<Person>();
CsvConfiguration csvConfig = new CsvConfiguration();
csvConfig.setFieldDelimiter(',');
csvConfig.setLineBreak("\n");
csvConfig.setQuoteCharacter('\"');

CsvDeserializer deSerializer = (CsvDeserializer) CsvIOFactory.createFactory(csvConfig, Person.class).createDeserializer();
String persons[] = new String(buffer).split("\n");
for (int i = 0; i < persons.length; i++) {
StringReader reader = new StringReader(persons[i] + "\n");
System.out.println("ReaderValue:" + persons[i]);
deSerializer.open(reader);
if (deSerializer.hasNext()) {
Person p = deSerializer.next();
System.out.println(p);
returnList.add(p);
}
deSerializer.close(true);
}
return returnList;
}
}

最佳答案

您所描述的是 Java NumberFormat 和相关类的已知行为。

一般来说,如果您尝试将字符串解析为数字,并且该字符串包含有效的数字格式后跟垃圾,则解析将成功,将使用有效部分,而垃圾将被忽略。

我不熟悉 jsefa,但我认为它使用内置的数字解析是一个不错的选择,例如BigDecimal(char[]) 构造函数来解析数字。因此,我猜您必须对某些 jsefa 类进行子类化,并添加您想要的格式检查。

关于java - BigDecimal 值反序列化的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24400114/

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