将嵌套的复杂json对象反序列化为仅字符串C#

时间:2018-08-08 20:44:55

标签: c# json json.net

我有一个看起来像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的结构不一致。那怎么办?谢谢!

4 个答案:

答案 0 :(得分:1)

尝试一下:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以在反序列化期间使用JToken捕获未知的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属性将以字符串形式包含JSON的settings部分。如果将对象重新序列化回JSON,则settings将保留以前的结构。

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

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

答案 3 :(得分:0)

我只有这个解决方案:

public class RootObject
        {
            public string name { get; set; }
            public Settings settings { get; set; }
            public string strSettings { get; set; } <-------- 
        }

  var data= Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(json);
    data.strSettings = Newtonsoft.Json.JsonConvert.SerializeObject(data.settings);