这可能是标题说明的所有问题之一.
我非常着迷readValue(file, class)于在Jackson库中找到的ObjectMapper 方法,该方法从文件中读取JSON字符串并将其分配给对象.
我很好奇是否可以通过从字符串中获取JSON并将其应用于对象来实现.
某种替代readValue()方法,它接受String而不是文件,并将其分配给对象?
例如,虽然默认readValue(file, class)方法如下所示:
ObjectMapper mapper = new ObjectMapper();
Student student = mapper.readValue("C:\\student.json", Student.class);
Run Code Online (Sandbox Code Playgroud)
我想知道杰克逊是否有某种方法允许以下方法:
ObjectMapper mapper = new ObjectMapper();
Student student = mapper.readValue("{\"id\":100,\"firstName\":\"Adam\"}", Student.class);
Run Code Online (Sandbox Code Playgroud)
第二个示例采用字符串和类的对象,而第一个示例采用文件和类的对象.
我只是想切出中间人,在这种情况下,文件.
这是可行的还是在杰克逊的限制范围内不存在这样的方法?
我有一个JSON数组,其中包含如下对象:
{
"bjones": {
"fname": "Betty",
"lname": "Jones",
"password": "ababab",
"level": "manager"
}
}
Run Code Online (Sandbox Code Playgroud)
我的User类有一个用户名,需要使用JSON对象的密钥.我如何获得JSON对象的密钥?
我现在拥有的是获取所有内容并创建一个新的User对象,但保留用户名为null.这是可以理解的,因为我的JSON对象不包含"username":"value"的键/值对.
Gson gson = new Gson();
JsonParser p = new JsonParser();
JsonReader file = new JsonReader(new FileReader(this.filename));
JsonObject result = p.parse(file).getAsJsonObject().getAsJsonObject("bjones");
User newUser = gson.fromJson(result, User.class);
// newUser.username = null
// newUser.fname = "Betty"
// newUser.lname = "Jones"
// newUser.password = "ababab"
// newUser.level = "manager"
Run Code Online (Sandbox Code Playgroud)
编辑:我正试图用Gson将"bjones"插入newUser.username,对不起澄清
我正在尝试使用rustc_serialize将JSON反序列化为Rust结构.问题是某些JSON具有一些可选字段,即可能存在也可能不存在.遇到第一个缺席字段的那一刻,解码器似乎纾困并且不考虑后续字段,即使它们存在.有办法克服这个问题吗?
这是代码:
extern crate rustc_serialize;
#[derive(Debug)]
struct B {
some_field_0: Option<u64>,
some_field_1: Option<String>,
}
impl rustc_serialize::Decodable for B {
fn decode<D: rustc_serialize::Decoder>(d: &mut D) -> Result<Self, D::Error> {
Ok(B {
some_field_0: d.read_struct_field("some_field_0", 0, |d| rustc_serialize::Decodable::decode(d)).ok(),
some_field_1: d.read_struct_field("some_field_1", 0, |d| rustc_serialize::Decodable::decode(d)).ok(),
})
}
}
fn main() {
{
println!("--------------------------------\n1st run - all field present\n--------------------------------");
let json_str = "{\"some_field_0\": 1234, \"some_field_1\": \"There\"}".to_string();
let obj_b: B = rustc_serialize::json::decode(&json_str).unwrap();
println!("\nJSON: {}\nDecoded: {:?}", json_str, obj_b);
}
{
println!("\n\n--------------------------------\n2nd run - \"some_field_1\" absent\n---------------------------------");
let json_str = …Run Code Online (Sandbox Code Playgroud) 我正在尝试反序列化一些JSON:
{
"a":1,
"b":25,
"c":"1-7",
"obj1":{
"a1":10,
"b1":45,
"c1":60
},
"obj2":[
{
"a2":100,
"b2":15,
"c2":50
},
{
"e2":"1,2,5-7",
"f2":"1,3-5",
"a2":25
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想找到一种方法来定义仅针对某些字段的自定义反序列化.
在下面的代码中,我将需要注意的字段(自定义处理)和可以以某种方式自动完成的字段分开.
是否可以自动反序列化"正常"字段?(不需要任何特定的自定义处理)
[JsonConverter(typeof(ConfigurationSerializer))]
public class Configuration
{
public int a { get; set; }
public int b { get; set; }
public Obj1 obj1 { get; set; }
public int[] c { get; set; }
public IList<Obj2> obj2 { get; set; }
}
public class ConfigurationSerializer : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, …Run Code Online (Sandbox Code Playgroud) 我有以下HAL + JSON示例:
{
"id": "4a17d6fe-a617-4cf8-a850-0fb6bc8576fd",
"country": "DE",
"_embedded": {
"company": {
"name": "Apple",
"industrySector": "IT",
"owner": "Klaus Kleber",
"_embedded": {
"emailAddresses": [
{
"id": "4a17d6fe-a617-4cf8-a850-0fb6bc8576fd",
"value": "test2@consoto.com",
"type": "Business",
"_links": {
"self": {
"href": "https://any-host.com/api/v1/customers/1234"
}
}
}
],
"phoneNumbers": [
{
"id": "4a17d6fe-a617-4cf8-a850-0fb6bc8576fd",
"value": "01670000000",
"type": "Business",
"_links": {
"self": {
"href": "https://any-host.com/api/v1/customers/1234"
}
}
}
],
},
"_links": {
"self": {
"href": "https://any-host.com/api/v1/customers/1234"
},
"phoneNumbers": {
"href": "https://any-host.com/api/v1/customers/1234"
},
"addresses": {
"href": "https://any-host.com/api/v1/customers/1234"
},
} …Run Code Online (Sandbox Code Playgroud) 我尝试使用System.Text.Json.Serialization命名空间将 JSON 文件中的文本反序列化为名为 Note 的对象,然后访问其属性。稍后的目的是读入多个 Note 对象,然后存储在列表中。
除了 DOTNET 文档https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-之外,似乎没有很多关于使用此命名空间的示例到
这是我根据给出的例子进行的尝试。这会引发如下所示的错误,如果您知道我做错了什么,请告诉我,谢谢。
class Note
{
public DateTime currentDate { get; set; }
public string summary { get; set; }
public Note(DateTime _date, string _sum)
{
currentDate = _date;
summary = _sum;
}
}
class Program
{
static void Main(string[] args)
{
//Write json data
string path = @"D:\Documents\Projects\Visual Projects\Notes Data\ThingsDone.json";
DateTime date = DateTime.Now;
string givenNote = "summary text";
Note completeNote = new Note(date, givenNote);
string serialString …Run Code Online (Sandbox Code Playgroud) 我想在 Kotlin 多平台项目中使用 kotlinx.serialization 解码包含多态类结构中的对象列表的 json 字符串,但它仅适用于 JVM,不适用于 Native。这是一个最小的可重现示例:
\n@Serializable\nabstract class Project {\n abstract val name: String\n}\n\n@Serializable\n@SerialName("BasicProject")\ndata class BasicProject(override val name: String): Project()\n\n@Serializable\n@SerialName("OwnedProject")\ndata class OwnedProject(override val name: String, val owner: String) : Project()\n\nfun main() {\n val data = Json.decodeFromString<List<Project>>("""\n [\n {"type":"BasicProject","name":"example"},\n {"type":"OwnedProject","name":"kotlinx.serialization","owner":"kotlin"} \n ]\n """))\n} \nRun Code Online (Sandbox Code Playgroud)\n这适用于 JVM,但在 Native 上会引发以下异常:
\nkotlinx.serialization.SerializationException: Serializer for class \xe2\x80\x98Project\xe2\x80\x99 is not found.\nMark the class as @Serializable or provide the serializer explicitly.\nOn Kotlin/Native explicitly declared serializer should be used for interfaces and …Run Code Online (Sandbox Code Playgroud) json kotlin json-deserialization kotlin-native kotlinx.serialization
我想在 C# 中序列化对象并了解我们可以同时执行此操作JsonSerializer和JsonConvert. 我了解有关这些的文档知识。
serialization但我想知道对于对象来说哪个更好?JsonSerializer或者JsonConvert?
我想启用一些 String 类型字段的自定义 jackson 反序列化器。反序列化器还需要注入一个基于 guice 的依赖 bean。示例代码如下:
public class CustomDeserializer extends StdDeserializer<String> {
private SomeDependecy dependency;
public StringDeserializer() {
this(null);
}
public StringDeserializer(Class<?> vc) {
super(vc);
}
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return dependency.perform(p.getValueAsString());
}
}
Run Code Online (Sandbox Code Playgroud)
我无法注册基于 Class 类型的模块,因为它是通用的(String.class、Complex Datatype(但并非每个模块都需要自定义反序列化器))。有没有办法在不使用静态方法的情况下实现上述目标?
PS:我确实搜索了网络,但如果不使用 statics 就找不到更干净的解决方案。使用一些静态方法来获取上下文和 bean 的所有建议。
我知道这个问题很常见,但在遵循不同的解决方案后,我找不到任何可行的解决方案。我想在 Kafka 中接收消息时反序列化字符串以及我的自定义类对象。使用 String 一切都很好,但不适用于我的班级。我在消费者配置中添加了受信任的包(com.springmiddleware.entities作为我的类所在的包):
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "foo");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put(JsonDeserializer.TRUSTED_PACKAGES, "com.springmiddleware.entities");
return props;
}
Run Code Online (Sandbox Code Playgroud)
我的application.yml文件中有这个:
spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: foo
auto-offset-reset: earliest
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
properties:
spring:
json:
trusted:
packages: 'com.springmiddleware.entities'
Run Code Online (Sandbox Code Playgroud)
并将这些行添加到 application.properties
spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
spring.kafka.consumer.properties.spring.json.trusted.packages=com.springmiddleware.entities
spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer
spring.kafka.producer.properties.spring.json.add.type.headers=false
Run Code Online (Sandbox Code Playgroud)
但以下错误一直显示:
org.apache.kafka.common.errors.SerializationException:在偏移量 1 处反序列化分区 topic2-0 的键/值时出错。如果需要,请寻找记录以继续消费。引起:java.lang.IllegalArgumentException:类“com.springmiddleware.entities.Crime”不在受信任的包中:[java.util, java.lang]。如果您认为这个类可以安全地反序列化,请提供它的名称。如果序列化仅由受信任的来源完成,您还可以启用全部信任 (*)。
更新
接收器配置:
@EnableKafka
@Configuration
public class ReceiverConfig {
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapServers; …Run Code Online (Sandbox Code Playgroud)