标签: json-deserialization

使用Jackson的JSON字符串到Java对象

这可能是标题说明的所有问题之一.

我非常着迷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)

第二个示例采用字符串和类的对象,而第一个示例采用文件和类的对象.

我只是想切出中间人,在这种情况下,文件.

这是可行的还是在杰克逊的限制范围内不存在这样的方法?

java json jackson json-deserialization

9
推荐指数
1
解决办法
1万
查看次数

使用GSON获取JSON密钥名称

我有一个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,对不起澄清

java json gson json-deserialization

9
推荐指数
1
解决办法
2万
查看次数

无法使用Rustc-serialize处理JSON中的可选字段

我正在尝试使用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 rust json-deserialization

9
推荐指数
1
解决办法
419
查看次数

自定义反序列化器仅适用于json.NET的某些字段

我正在尝试反序列化一些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)

c# json.net json-deserialization

9
推荐指数
1
解决办法
5749
查看次数

将hal + json反序列化为复杂模型

我有以下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)

c# json json.net deserialization json-deserialization

9
推荐指数
1
解决办法
610
查看次数

使用 System.Text.Json 将 JSON 反序列化为对象

我尝试使用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)

c# json json-deserialization system.text.json

9
推荐指数
1
解决办法
2万
查看次数

在 Kotlin/Native 中使用 kotlinx.serialization 进行多态反序列化

我想在 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}  \n
Run Code Online (Sandbox Code Playgroud)\n

这适用于 JVM,但在 Native 上会引发以下异常:

\n
kotlinx.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

9
推荐指数
1
解决办法
6484
查看次数

哪个更适合用于序列化对象?JsonSerializer 或 JsonConvert

我想在 C# 中序列化对象并了解我们可以同时执行此操作JsonSerializerJsonConvert. 我了解有关这些的文档知识。

serialization但我想知道对于对象来说哪个更好?JsonSerializer或者JsonConvert

c# serialization json jsonserializer json-deserialization

8
推荐指数
1
解决办法
7378
查看次数

如何将依赖注入 Jackson 自定义反序列化器

我想启用一些 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 的所有建议。

java guice jackson json-deserialization

8
推荐指数
2
解决办法
3618
查看次数

Spring Boot Kafka 类反序列化——不在受信包中

我知道这个问题很常见,但在遵循不同的解决方案后,我找不到任何可行的解决方案。我想在 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)

java apache-kafka json-deserialization spring-boot

8
推荐指数
1
解决办法
9352
查看次数