将嵌套的复杂json对象反序列化为字符串c#
我有一个JSON,它看起来像:将嵌套的复杂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
{
"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,但我真的需要将其作为字符串属性保留。太棒了!这非常有效很明显,我能够很容易地适应我遇到的另一个挑战。谢谢!!!这会起作用,但布莱恩的解决方案对我来说更好。谢谢!