首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Newtonsoft Json如何将int值转换为字符串

使用Newtonsoft Json如何将int值转换为字符串
EN

Stack Overflow用户
提问于 2021-12-20 19:30:03
回答 1查看 1.4K关注 0票数 1

我刚刚开始检查如何在需要使用ArangoDB的项目中使用json来序列化和反序列化。

目前,我有一个测试类AnoherTestPerson

代码语言:javascript
运行
复制
public class AnotherTestPerson
    {
        public AnotherTestPerson(int id, string fullname, int age)
        {
            this.Id = id;
            this.Fullname = fullname;
            this.Age = age;
        }

        public int Id { get; set; }
        public string Fullname { get; set; }
        public int Age { get; set; }
    }

现在,我需要将Id值转换为字符串,因为当您将数字值作为_key传递时,_key无法工作,所以我猜我必须从Arango驱动程序使用的序列化程序中进行转换,因为在我将要处理的项目中,我们将无法访问我们想要存储在数据库上的实体的类。

任何帮助都将不胜感激,因为我仍在学习如何使用Json和C#进行序列化。

下面是其余的代码:

代码语言:javascript
运行
复制
public static async Task Main(string[] args)
    {

        string connectionString = "private";

        var arango = new ArangoContext(cs:connectionString, settings:
            new ArangoConfiguration
            {
                Serializer = new ArangoNewtonsoftSerializer(CustomDataContractResolver.Instance)
                //Using custom contract resolver for automatically changing the Id name
                //from the object class to _key in the Json file
            }
        );
        await arango.Document.CreateAsync("TestDB", typeof(AnotherTestPerson).Name, testPerson);
    }

这是定制的合同解析器。我试着改变了这里的房产类型,但没起作用。

代码语言:javascript
运行
复制
public class CustomDataContractResolver : DefaultContractResolver
{
    public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver();

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        if (property.PropertyName.Equals("Id", StringComparison.OrdinalIgnoreCase))
        {
            property.PropertyName = "_key";
            if(property.PropertyType == Type.GetType("System.Int32"))
            {
                property.PropertyType = Type.GetType("System.String");
            }
        }
        return property;
    }
}

编辑

因此,通过检查SBFrancies的注释,我实现了一个基本的JsonConverter:

代码语言:javascript
运行
复制
public class ToStringJsonConverted : Newtonsoft.Json.JsonConverter
{
    public static readonly ToStringJsonConverted Instance = new ToStringJsonConverted();

    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
    {
        writer.WriteValue(value.ToString());
    }
}

并将其链接到自定义ContractResolver:

代码语言:javascript
运行
复制
public class CustomDataContractResolver : DefaultContractResolver
{
    public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver();

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        if (property.PropertyName.Equals("Id", StringComparison.OrdinalIgnoreCase))
        {
            property.PropertyName = "_key";
            if(property.PropertyType == Type.GetType("System.Int32"))
            {
                property.Converter = ToStringJsonConverted.Instance;
            }
        }
        return property;
    }
}

它按我的意愿序列化,但反序列化现在不起作用。现在,我将检查如何读取Json文件并解析它们。

EN

回答 1

Stack Overflow用户

发布于 2021-12-20 21:18:44

我得到了序列化和反序列化工作,并在注释中的@SBFrancies提供了帮助。

ContractResolver:

代码语言:javascript
运行
复制
public class CustomDataContractResolver : DefaultContractResolver
{
    public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver();

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        if (property.PropertyName.Equals("Id", StringComparison.OrdinalIgnoreCase))
        {
            property.PropertyName = "_key";
            if(property.PropertyType == Type.GetType("System.Int32"))
            {
                property.Converter = ToStringJsonConverted.Instance;
            }
        }
        return property;
    }
}

JsonConverter:

代码语言:javascript
运行
复制
public class ToStringJsonConverted : Newtonsoft.Json.JsonConverter
{
    public static readonly ToStringJsonConverted Instance = new ToStringJsonConverted();

    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
    {
        return Int32.Parse((string)reader.Value);
    }

    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
    {
        writer.WriteValue(value.ToString());
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70427032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档