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

将嵌套的复杂json对象反序列化为字符串c#,c#,json,json.net,C#,Json,Json.net,我有一个JSON,它看起来像: { "name": "foo", "settings": { "setting1": true, "setting2": 1 } } public class Settings { public bool settings1 { get; set; } public int settings2 { get; set; } } public class RootObject { public string

我有一个JSON,它看起来像:

{
  "name": "foo",
  "settings": {
    "setting1": true,
    "setting2": 1
  }
}  
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; }
}
我知道如何使用json2csharp.com创建C#类来反序列化它。它们看起来像:

{
  "name": "foo",
  "settings": {
    "setting1": true,
    "setting2": 1
  }
}  
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; }
}

i、 例如,所有的“设置”JSON只需要保存为字符串——JSON的结构不一致。如何做到这一点?谢谢

我只有这个解决方案:

public class RootObject
        {
            public string name { get; set; }
            public Settings settings { get; set; }
            public string strSettings { get; set; } <-------- 
        }
公共类根对象
{
公共字符串名称{get;set;}
公共设置{get;set;}
公共字符串strSettings{get;set;}尝试以下方法:

public class RootObject
        {
            public string name { get; set; }
            public Dictionary<string,object> settings { get; set; }
        }
公共类根对象
{
公共字符串名称{get;set;}
公共词典设置{get;set;}
}
小提琴:

尝试使用Newtonsoft.Json plus 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>();
string jsonText=@”{
'name':'foo',
“设置”:{
“设置1”:为真,
“设置2”:1
}
}";
JObject-jObj=JObject.Parse(jsonText);
var设置=jObj.subjects()
第()类
.Where(p=>p.Name==“设置”)
.First()
.Value.ToObject();

您可以使用
JToken
在反序列化过程中捕获未知的
设置
,然后使用第二个属性允许您以字符串形式访问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);
var root=JsonConvert.DeserializeObject(json);
Settings
属性将包含JSON的
Settings
部分作为字符串。如果将对象重新序列化回JSON,则
Settings
将保留以前的任何结构

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


这里是一个往返演示:

而不是使用字符串(除非这是您真正想要的),你可能会把它放到某种字典里。我在这里回答了类似的问题:@PeteGarafano。我确实需要它作为一个字符串,你我认为你的想法是对的。我只需要像这样做:
code
var rawObj=JsonConvert.DeserializeObject(json);var uniq=rawObj.name;var settings=rawObj.settings;
code
感谢您的帮助idea@John看我的答案,我不认为在这里使用dynamic是“最干净的”解决方案。@John我在回答中使用了
dynamic
,但没有什么能阻止你将其编入
字典或类似的东西。如果它有帮助,我将称之为胜利。祝你好运!这不起作用。他说设置的结构不一致,所以你不能使用这样的设置类。我不能重新定义像这样的e RootObject和真正的对象更复杂,它不会总是进入字典,但是dotnetfiddle的+1。我喜欢这些!@John为什么不能进入字典?字典代表了中的任何对象结构。NETYes,它可以解析json,但我真的需要将其作为字符串属性保留。太棒了!这非常有效很明显,我能够很容易地适应我遇到的另一个挑战。谢谢!!!这会起作用,但布莱恩的解决方案对我来说更好。谢谢!