为了账号安全,请及时绑定邮箱和手机立即绑定

将嵌套的复杂 json 对象反序列化为一个字符串 c#

将嵌套的复杂 json 对象反序列化为一个字符串 c#

C#
DIEA 2021-11-21 10:57:32
我有 JSON,它看起来像:{  "name": "foo",  "settings": {    "setting1": true,    "setting2": 1  }}  我知道如何使用 json2csharp.com 创建 C# 类来反序列化它。它们看起来像:public class Settings{    public bool settings1 { get; set; }    public int settings2 { get; set; }}public class RootObject{    public string name { get; set; }    public Settings settings { get; set; }}但我想要的是简单地将其反序列化为public class RootObject{    public string name { get; set; }    public string settings { get; set; }}即,所有“设置”JSON 只需要保存为字符串——该 JSON 的结构不一致。那怎么办呢?谢谢!
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您可以在反序列化期间使用 aJToken来捕获您的未知数settings,然后使用第二个属性来允许您在需要时以字符串形式访问该 JSON。


像这样设置你的类:


public class RootObject

{

    [JsonProperty("name")]

    public string Name { get; set; }


    [JsonIgnore]

    public string Settings

    {

        get { return SettingsToken != null ? SettingsToken.ToString(Formatting.None) : null; }

        set { SettingsToken = value != null ? JToken.Parse(value) : JValue.CreateNull(); }

    }


    [JsonProperty("settings")]

    private JToken SettingsToken { get; set; }

}

然后像往常一样反序列化:


var root = JsonConvert.DeserializeObject<RootObject>(json);

该Settings属性将包含settingsJSON的一部分作为字符串。如果您将对象重新序列化回 JSON,那么settings它将保留它之前的任何结构。


您还可以将该Settings属性更改为其他一些 JSON 字符串,只要它格式正确。(如果不是,则将立即抛出异常。)


这是一个往返演示:https : //dotnetfiddle.net/thiaWk


查看完整回答
反对 回复 2021-11-21
?
翻阅古今

TA贡献1780条经验 获得超5个赞

尝试使用 Newtonsoft.Json 和 LINQ:


string jsonText = @"{

            'name': 'foo',

            'settings': {

                'settings1': true,

                'settings2': 1

                }

            }";


JObject jObj = JObject.Parse(jsonText);

var setting = jObj.Descendants()

                .OfType<JProperty>()

                .Where(p => p.Name == "settings")

                .First()

                .Value.ToObject<Settings>();


查看完整回答
反对 回复 2021-11-21
?
偶然的你

TA贡献1841条经验 获得超3个赞

尝试这个:


public class RootObject

        {

            public string name { get; set; }

            public Dictionary<string,object> settings { get; set; }

        }

小提琴:https : //dotnetfiddle.net/QN3nWL


查看完整回答
反对 回复 2021-11-21
  • 3 回答
  • 0 关注
  • 354 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信