我有以下字符串:
String json = "[{\"id\": \"0\", \"ip\": \"123\", \"mac\": \"456\"}, {\"id\": \"1\", \"ip\": \"111\", \"mac\": \"222\"}]";
Run Code Online (Sandbox Code Playgroud)
还有一个 SlaveEntity 实体,它具有:
public class SlaveEntity extends BaseEntity {
private String ip;
private String macAddress;
private String status;
@OneToMany(mappedBy="slave", targetEntity = PositionEntity.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<PositionEntity> positions;
}
Run Code Online (Sandbox Code Playgroud)
我正在编写一个接受 json 并返回一个 SlaveEntity 列表的方法:
public static List<SlaveEntity> JsonToSlaveEntity(String json) {
ObjectMapper objectMapper = new ObjectMapper();
List<SlaveEntity> obj = new ArrayList<SlaveEntity>();
try {
obj = objectMapper.readValue(json, List.class);
} catch (IOException e) { …Run Code Online (Sandbox Code Playgroud) 我有这个json文件:
{
"gateway_name": "gateway1",
"fields": [
{"name":"Code", "value":""},
{"name":"PaymentId", "value":""},
{"name":"RefNo", "value":""}
]
}
Run Code Online (Sandbox Code Playgroud)
我试图用Jackson对象映射器解析这个文件并遍历fields数组。我想要实现的是当name等于时RefNo,操纵valueto 1112,所以它会变成:
{
"gateway_name": "gateway1",
"fields": [
{"name":"Code", "value":""},
{"name":"PaymentId", "value":""},
{"name":"RefNo", "value":"1112"}
]
}
Run Code Online (Sandbox Code Playgroud)
我如何检查field值并将其设置value为1112?
到目前为止我尝试的是:
Resource resource = new ClassPathResource("gateway-fields.json"); //read from json file
JsonFactory jsonFactory = new JsonFactory();
ObjectMapper objectMapper = new ObjectMapper(jsonFactory);
JsonNode arrayNode = objectMapper.readTree(resource.getFile()).get("fields");
if (arrayNode.isArray()) {
for (JsonNode jsonNode : arrayNode) { …Run Code Online (Sandbox Code Playgroud) 我正在使用 Spring Boot 构建一个应用程序,并且必须设置自引用关系。
为了使场景简单易懂,我尝试使用部门实体示例来处理类似的场景。
以下是我需要设置自引用关系的场景
为了设置这样的场景,我按以下方式定义了实体部门。
部门.java
public class Department {
@Id
@GenericGenerator(name = "sequence_department_id", strategy = "com.app.mycompany.AgileCenterServices.util.DepartmentIdGenerator")
@GeneratedValue(generator = "sequence_department_id")
@Column(unique = true)
private String id;
private String name;
private String location;
private String costCenter;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="parentDepartment")
private Department parentDepartment;
@OneToMany(mappedBy="parentDepartment")
private Set<Department> linkedDepartments = new HashSet<Department>();
/* getters & setters */
}
Run Code Online (Sandbox Code Playgroud)
DepartmentController.java
@CrossOrigin
@RequestMapping(value = "/", method = RequestMethod.POST)
public Department createDepartment(@RequestBody String trial) throws Exception {
logger.info("Inside createDepartment() API "); …Run Code Online (Sandbox Code Playgroud) json self-reference spring-data-jpa spring-boot objectmapper
我有一个文件,可以说是这样的,它是装箱为本机类型或字符串的双值。
{ "field1" : 123.00 }
Run Code Online (Sandbox Code Playgroud)
或者
{"field1" : "123.00" }
Run Code Online (Sandbox Code Playgroud)
和相应的 Pojo:
class Response{
Double field1;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果它是字符串格式,我会看到一个错误,如下所示:
Caused by: java.lang.NoSuchFieldError: USE_FAST_DOUBLE_PARSER
at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$DoubleDeserializer._parseDouble(NumberDeserializers.java:755)
at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$DoubleDeserializer.deserialize(NumberDeserializers.java:684)
Run Code Online (Sandbox Code Playgroud)
显然,同样的事情适用于 Int 或 long 对于字符串或纯数字。为什么 Double 会失败?
是否有任何注释可以使其适用于两种格式?或者解决从字符串解析的问题?
或者,它可以使用@Jsonsetter。
谢谢
我正在使用Alamofire和ObjectMapper,我的模型类就是这样
class Category: Object, Mappable {
dynamic var id: Int = 0
dynamic var name = ""
dynamic var thumbnail = ""
var children = List<Category>()
override static func primaryKey() -> String? {
return "id"
}
required convenience init?(_ map: Map) {
self.init()
}
func mapping(map: Map) {
id <- map["id"]
name <- map["name"]
thumbnail <- map["thumbnail"]
children <- map["children"]
}
Run Code Online (Sandbox Code Playgroud)
}
而我正在使用这样的Alamofire
Alamofire.request(.GET, url).responseArray { (response: Response<[Category], NSError>) in
let categories = response.result.value
if let categories = categories { …Run Code Online (Sandbox Code Playgroud) 我正在查看ObjectMapper库。并注意到了<-接线员。
这究竟是如何运作的?
// Mappable
func mapping(map: Map) {
username <- map["username"]
age <- map["age"]
weight <- map["weight"]
array <- map["arr"]
dictionary <- map["dict"]
bestFriend <- map["best_friend"]
friends <- map["friends"]
birthday <- (map["birthday"], DateTransform())
}
Run Code Online (Sandbox Code Playgroud)
另外下面的行是如何工作的
birthday <- (map["birthday"], DateTransform())
Run Code Online (Sandbox Code Playgroud)
我知道birthday现在是一个元组。可以通过以下方式访问
self.birthday.0
self.birthday.1
Run Code Online (Sandbox Code Playgroud)
虽然属性是这样定义的
var birthday: NSDate?
Run Code Online (Sandbox Code Playgroud)
元组如何响应 a NSDate(在本例中)?
谢谢!
我在使用ObjectMapper将json映射到我的对象数组时遇到了麻烦.这是我的模型对象.
class Participant : Mappable {
var user_global_id: String!
var user_app_id: String!
init(){
}
required init?(_ map: Map) {
}
// Mappable
func mapping(map: Map) {
user_global_id <- map["user_global_id"]
user_app_id <- map["user_app_id"]
}
}
Run Code Online (Sandbox Code Playgroud)
而我的json看起来: "[{\"user_global_id\":5093363330056192,\"user_app_id\":11}]"
我在调用ObjectMapper:
let participants = Mapper<[Participant]>().map(json["registeredParticipants"])
Run Code Online (Sandbox Code Playgroud)
上面的行给出错误: Type '[Participant]' does not conform to protocol 'Mappable'
我有一个CustomSerializer用于编写特定字段.我呼吁的自定义序列化ObjectMapper与像某些配置WRAP_ROOT_VALUE,PropertyNameStrategy,Inclusion.NON_NULL.
现在在我的自定义序列化程序中,除了one(WRAP_ROOT_VALUE)之外,我在序列化自定义类时需要所有这些属性.
public class CustomSerializer extends JsonSerializer<Object>{
@Override
public void serialize(Object obj, JsonGenerator jgen,
SerializerProvider arg2) throws IOException,
JsonProcessingException {
//.......
jgen.writeObject(obj);
//...
}
Run Code Online (Sandbox Code Playgroud)
所以我的obj这里被序列化了root值包装,我不想要.
我出于某种原因无法编辑我的POJO.
如何禁用ObjectmapperCustomSerializer中的单个(或某些)属性???
我试图使用Jackson2ObjectMapperBuilderCustomizer将自定义问题处理程序添加到对象映射器:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder builder) {
ObjectMapper m = builder.build();
m.addHandler(
new DeserializationProblemHandler() {
@Override
public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser p, JsonDeserializer<?> deserializer, Object beanOrClass, String propertyName) throws IOException {
System.out.println("ahahahaa");
return super.handleUnknownProperty(ctxt, p, deserializer, beanOrClass, propertyName);
}
}
);
}
};
}
Run Code Online (Sandbox Code Playgroud)
但是当我自动装配ObjectMapper bean时,_problemHandlers属性为null。
我也尝试过使用以下命令自定义现有的ObjectMapper:
@Autowired
public customize(ObjectMapper mapper) {
...
}
Run Code Online (Sandbox Code Playgroud)
但是结果是一样的。我不知道谁可以删除此属性。我根本不会在另一个地方初始化对象映射器的其他构建器/工厂/等。我做错了什么?
我在 Java 8 中使用 spring boot 2.2.6 和 Jackson 2.10.3。我在整个项目中使用 localdatetime 对象。Jackson 无法正确解析 LocalDateTime(或者可能是默认格式)并以如下数组格式在 json 响应中发送日期
"createdDate": [
2020,
8,
31,
0,
0,
0,
80000000
]
Run Code Online (Sandbox Code Playgroud)
如Spring Boot中的JSON Java 8 LocalDateTime 格式所述,Spring Boot 2 已经在类路径上默认设置了 jackson-datatype-jsr310:2.10.3。我希望日期在整个项目中以 json 表示为 2020-03-31:00。第一个解决方案在上面的链接中不起作用。在那之后,我尝试了 @JsonSerialize 注释并且它有效,但我不想应用于每个类。所以也试图覆盖对象映射器但它没有用
@Primary
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
SimpleModule module = new SimpleModule("my custom date serializer");
module.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer());
mapper.registerModule(module);
return mapper;
}
Run Code Online (Sandbox Code Playgroud)
还尝试自定义 Jackson2ObjectMapperBuilder,但仍然有数组格式的日期
@Bean
public Jackson2ObjectMapperBuilder …Run Code Online (Sandbox Code Playgroud) objectmapper ×10
java ×6
jackson ×4
json ×3
spring-boot ×3
swift ×3
spring ×2
alamofire ×1
jackson2 ×1