首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何仅以字段名作为数据成员来序列化json?

如何仅以字段名作为数据成员来序列化json?
EN

Stack Overflow用户
提问于 2020-11-17 19:10:18
回答 1查看 1.7K关注 0票数 1

我有一个这样的POCO:

代码语言:javascript
运行
复制
public class Process
{
    public Process() { }

    [DataMember(Name = "lang_code")]
    public string LCode { get; set; }

    [DataMember(Name = "data_currency")]
    public string Currency { get; set; }

    [DataMember(Name = "country_code")]
    public string CCode { get; set; }

    public override string ToString()
    {
        return JsonConvert.SerializeObject(this);
    }
}

现在,当我序列化我的POCO时,我得到了这样的json,它有字段名:

代码语言:javascript
运行
复制
{"LCode":"en-US","Currency":"USD","CCode":"IN"}

有什么方法可以像序列化POCO之后的DataMember字段那样获得它吗?如下所示:

代码语言:javascript
运行
复制
{"lang_code":"en-US","data_currency":"USD","country_code":"IN"}

下面是我们的代码:

代码语言:javascript
运行
复制
ProcessStr = ExtractHeader(headers, PROCESS_HEADER);
Console.WriteLine(ProcessStr);
if (!string.IsNullOrWhiteSpace(ProcessStr))
{
    Process = DeserializeJson<Process>(ProcessStr);
    if (Process != null && !string.IsNullOrWhiteSpace(Process.Gold))
    {
        Process.Gold = HttpUtility.HtmlEncode(Process.Gold);
    }
    ProcessStr = Process.ToString();
    Console.WriteLine(ProcessStr);
}

private T DeserializeJson<T>(string str) where T : new()
{
    try
    {
        return Utf8Json.JsonSerializer.Deserialize<T>(str);
    }
    catch (Exception e)
    {
        return new T();
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2020-11-17 19:51:08

看起来您使用了两个不同的包:Newtonsoft.Json序列化和Utf8Json反序列化。它们使用不同的注释。你可以让它工作,但它可能更容易选择一个或另一个。

Newtonsoft.Json使用JsonProperty属性,而Utf8Json使用DataMember属性。

代码语言:javascript
运行
复制
using System;
using System.Diagnostics;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Utf8Json;

namespace JSONPropertyTest
{
    public class Process
    {
        public Process() { }

        [JsonProperty("lang_code")]
        [DataMember(Name = "lang_code")]
        public string LCode { get; set; }

        [JsonProperty("data_currency")]
        [DataMember(Name = "data_currency")]
        public string Currency { get; set; }

        [JsonProperty("country_code")]
        [DataMember(Name = "country_code")]
        public string CCode { get; set; }

        public override string ToString()
        {
            return JsonConvert.SerializeObject(this);
        }
    }

    class Program
    {
        static private T DeserializeJson<T>(string str) where T : new()
        {
            try
            {
                return Utf8Json.JsonSerializer.Deserialize<T>(str);
            }
            catch (Exception e)
            {
                return new T();
            }
        }

        static void Main(string[] args)
        {
            var test = new Process { LCode = "en-US",Currency = "USD", CCode = "IN" };
            var json = test.ToString();

            Console.WriteLine($"serialized={test}");
            var deserialized = DeserializeJson<Process>(json);
            Debug.Assert(test.CCode == deserialized.CCode);
            Debug.Assert(test.LCode == deserialized.LCode);
            Debug.Assert(test.Currency == deserialized.Currency);
            Console.WriteLine($"deserialized={deserialized}");
        }
    }
}

要使用Utf8Json,您需要更新ToString方法,这是您展示的代码中唯一依赖Newtonsoft.Json的方法。看起来是这样的:

代码语言:javascript
运行
复制
    public class Process
    {
        public Process() { }

        [DataMember(Name = "lang_code")]
        public string LCode { get; set; }

        [DataMember(Name = "data_currency")]
        public string Currency { get; set; }

        [DataMember(Name = "country_code")]
        public string CCode { get; set; }

        public override string ToString()
        {
            return Utf8Json.JsonSerializer.ToJsonString(this);
        }
    }
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64881777

复制
相关文章

相似问题

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