【问题标题】:Deserialize nested, complex json object to just a string c#将嵌套的复杂json对象反序列化为字符串c#
【发布时间】:2018-08-09 07:48:20
【问题描述】:

我的 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 的结构并不一致。怎么可能呢?谢谢!

【问题讨论】:

  • 而不是去一个字符串(除非这真的是你想要的),你可能会得到它进入某种字典。我在这里回答了类似的问题:stackoverflow.com/questions/23505096/…
  • @PeteGarafano。我确实需要它作为字符串,你我认为你有正确的想法。我只需要这样做:code var rawObj = JsonConvert.DeserializeObject(json); var uniq = rawObj.name; var settings = rawObj.settings; code 谢谢你的想法
  • @John 看到我的回答,我不认为在这里使用动态是“最干净”的解决方案。
  • @John 我在那个答案中用dynamic 做到了,但没有什么能阻止你把它变成Dictionary<string, string> 或类似的东西。如果它有帮助,我会称之为胜利。祝你好运!

标签: c# json json.net


【解决方案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

【讨论】:

  • 太棒了!这非常有效,我能够轻松地调整它以应对我遇到的另一个挑战。谢谢!!!
【解决方案2】:

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

【讨论】:

  • 这可行,但布赖恩的解决方案对我来说更好。谢谢!
【解决方案3】:

试试这个:

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

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

【讨论】:

  • 我不能像这样重新定义 RootObject,真实的对象更复杂,它不会总是进入字典,但为 dotnetfiddle +1。我喜欢那些!
  • @John 为什么不能进入字典? Dictionary 表示 .NET 中的任何对象结构
  • 是的,它确实可以解析 json,但我确实需要将其保留为字符串属性。
【解决方案4】:

我只有这个解决方案:

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);

【讨论】:

  • 这行不通。他说设置的结构并不一致,所以你不能使用这样的设置类。
猜你喜欢
  • 2018-03-20
  • 1970-01-01
  • 2018-10-25
  • 2022-01-20
  • 1970-01-01
  • 2019-09-11
  • 2016-12-12
  • 2020-06-09
相关资源
最近更新 更多