【问题标题】:Append fields to Json record object [duplicate]将字段附加到 Json 记录对象 [重复]
【发布时间】:2015-04-21 14:56:13
【问题描述】:

我正在使用 Newtonsoft 的 Json.Net。 我有这个 Json:

var j1 = {"status_code":"200", "message":"everything is ok"};

这是另一个 Json:

var j2 = {"records":[{"id":"1", "name":"file1"},
                      {"id":"2", "name":"file2"},
                      {"id":"3", "name":"file3"}]
         }; 

基本上第二个 j2 是目录中的文件列表(数组)。 它可能是空的:

 {"records":"[]"}

我想要的是:将 (concat, merge) j2 附加到 j1 的末尾,如下所示:

var j3 = {
          "status_code":"200", 
          "message":"everything is ok", 
          "records":[{"id":"1", "name":"file1"},
                      {"id":"2", "name":"file2"},
                      {"id":"3", "name":"file3"}]
         };
         // NOTE: the array does NOT have double quots ("")

如何使用 JsonConvert.Serialize() 或 Newtonesoft 的 Json.NET 中的任何其他方式完成此操作?

【问题讨论】:

  • 您能告诉我们您为实现这一目标编写了哪些代码吗?
  • 如果您提供真实代码而不是伪代码会有所帮助...我们不知道您在 LINQ to JSON 等方面使用的是什么。
  • 不是重复的。这是将字段附加到 Json 对象。不合并。我还没有编码这个
  • 请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”!

标签: c# asp.net .net json json.net


【解决方案1】:
var j = JsonConvert.SerializeObject(new[] { JsonConvert.DeserializeObject(j1), 
JsonConvert.DeserializeObject(j2) });

var j = JsonConvert.SerializeObject(new { obj1 = JObject.Parse(j1), 
                                          obj2 = JObject.Parse(j2) });

【讨论】:

  • 试过这个。这将产生不同的结果:{obj1 = {"status..."}, obj2 = "records:..."}
  • 这不会导致 OP 要求...
【解决方案2】:

可以试试这个(注意:没有任何空检查...):

string json1 = "{\"status_code\":\"200\",\"message\":\"everything is ok\"}";
string json2 = "{\"records\":[{\"id\":\"1\",\"name\":\"file1\"},{\"id\":\"2\",\"name\":\"file2\"},{\"id\":\"3\",\"name\":\"file3\"}]}";

dynamic object1 = JsonConvert.DeserializeObject(json1);
dynamic object2 = JsonConvert.DeserializeObject(json2);

dynamic result = object1;
result.records = object2.records;

string serialized = JsonConvert.SerializeObject(result);

【讨论】:

  • 这确实效率低下,完全没有必要时使用dynamic
【解决方案3】:

这些答案过于复杂了......只需在调用 SerializeObject 的地方创建一个新的内联匿名类型,它看起来像这样;

  string serialized = JsonConvert.SerializeObject(new { status_code = j1.status_code, 
                                                        message = j1.message,
                                                        records = j2.records } );                                            

【讨论】:

    【解决方案4】:

    这可能有效。

    var j3 = j1.concat(j2);
    

    【讨论】:

      【解决方案5】:

      您可以通过使用内置于 LINQ to JSON 的 JSON.NET 来实现:

      string j1 = {"status_code":"200", "message":"everything is ok"};
      string j2 = {"records":[{"id":"1", "name":"file1"},
                                {"id":"2", "name":"file2"},
                                {"id":"3", "name":"file3"}]
                   }; 
      
      JObject jObject1 = JObject.Parse(j1);
      JObject jObject2 = JObject.Parse(j2);
      
      jObject1.Merge(jObject2, new JsonMergeSettings
                      {
                          MergeArrayHandling = MergeArrayHandling.Concat
                      });
      
      string j3 = jObject1.ToString();
      

      j3 变量看起来就像这样:

      {
          "status_code": "200",
          "message": "everything is ok",
          "records": [
              {
                  "id": "1",
                  "name": "file1"
              },
              {
                  "id": "2",
                  "name": "file2"
              },
              {
                  "id": "3",
                  "name": "file3"
              }
          ]
      }
      

      这就是你想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-24
        • 2012-11-23
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 2015-11-01
        • 2018-07-23
        相关资源
        最近更新 更多