【问题标题】:Convert one JSON structure to another using Json.Net使用 Json.Net 将一种 JSON 结构转换为另一种
【发布时间】:2017-07-22 05:45:43
【问题描述】:

输入 JSON:

{
    "name" : "objname",
    "abc" : 1,
    "def" : 2
}

所需的输出 JSON:

{
    "objname" :
    {
        "abc" : 1,
        "def" : 2 
    }
}

我尝试了如下图,但我觉得这不是正确的方法。

// This is the class object
public class Obj
{
    public string Name { get;set;}
    public string abc { get; set; }
    public string def { get; set; }
}         

var obj = JsonConvert.DeserializeObject<Obj>(json);

StringBuilder sb = new StringBuilder();
sb.Append(" { ");
sb.AppendLine(obj.Name);
sb.AppendLine(" :  {");
sb.AppendLine(GetMemberName(() => obj.abc) + ":" + obj.abc + ",");
sb.AppendLine(GetMemberName(() => obj.def) + ":" + obj.abc);
sb.AppendLine(" :  }");

【问题讨论】:

  • 输入是无效的json,输出也是如此
  • 1) 您想要的输出 "objname" : { "abc" : 1, "def" : 2 } 甚至不是 JSON,它缺少外部 {}。 2) 到目前为止你尝试过什么?
  • 查看这个包的主页。 newtonsoft.com/json。您将看到一个 Serialize 和 DeserializeObject。这就是你需要的。在这里提问之前请先尝试。
  • 所以请展示您尝试过的内容以及发生了什么。
  • @GarrGodfrey:不,JSON 不必以 {[ 开头。例如,拥有一个 只是 字符串、空标记或数字的 JSON 文档是完全有效的。但是,是的,对于一个对象,您确实需要大括号。

标签: c# json linq json.net


【解决方案1】:

第一步是反序列化。你可以去字典:

Dictionary<string, string> dict = 
    JsonConvert.DeserializeObject<Dictionary<string, object>>(json);

然后,要取回它,您可能还需要使用字典。您不能使用预定义的(甚至是编译器生成的)类,因为您不知道属性名称。

String name = (string)dict["name"];
// remove name from dictionary
dict.Remove(name);
var output = 
   new Dictionary<string,object>() {{name, dict}};

然后,将其保存回来:

string json = JsonConvert.SerializeObject(output);

【讨论】:

  • 这将不会产生请求的输出 => .net fiddle
  • 您将不得不反序列化为Dictionary&lt;string,object&gt; => .net fiddle
  • 是的,错字。修复
  • 是的,看到了你的小提琴。我本来是想当向导的,还没准备好去
  • @GarrGodfrey 非常感谢。它的工作。我不知道如何利用字典。
猜你喜欢
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多