我有一个看起来像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的结构不一致。那怎么办?谢谢!
答案 0 :(得分:1)
尝试一下:
public class RootObject
{
public string name { get; set; }
public Dictionary<string,object> settings { get; set; }
}
答案 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);