如何编写一个映射函数,该函数接受一串json有效负载和另一串映射,并返回一串映射的数据

时间:2019-01-02 15:40:43

标签: c# json json.net

我想编写一个映射函数,该函数接受一串json有效负载和另一串映射,并返回一串映射的数据。例如有效载荷为:

{
    "Name" : "Hello",
    "This" : {
        "That" : {
            "TheOther" : "There"
        }
    }
}

和一张地图:

 {
    "Test_Name" : "Name",
    "Test_Value" : "This.That.TheOther"
 }

应返回:

 {
    "Test_Name" : "Hello",
    "Test_Value" : "There"
 }

3 个答案:

答案 0 :(得分:0)

如果将JPaths保留在映射JSON中会更容易。

您可以在jobject1中加载原始JSON。 您可以将JSON映射加载到jobject2。

如下所示的循环应该可以帮助您获得结果

假设-我假设您的地图JSON将仅包含一个对象的地图,而您的原始JSON将包含元素数组。

for each object in jobject1
  for each object in jobject2
     for each property in object
       get the value field (which would be JPath referring to some location in jobject1).
       set the value field to value of JPath
     end for
  end for
end for

答案 1 :(得分:0)

好吧,正如您所建议的那样,您必须将Json转换为可用的结构,用于该结构的公共库将是NewtonSoft.Json,可在nuget上使用,然后可以像按照方式

var sourceObject = JsonConvert.DeserializeObject<JObject>( jsonContent );
var sourceMap = JsonConvert.DeserializeObject<IDictionary<string, string>>( jsonMap );

然后将对象设为JObject,然后可以通过以下方式对其进行解析

private static IDictionary<string,object> MapData( JObject source, IDictionary<string,string> map ) {
    var result = new Dictionary<string, object>();
    foreach (var kvp in map) {
        result.Add( kvp.Key, source.SelectToken( kvp.Value ).Value<object>() );
    }
    return result;
}

这将为您返回带有键和所找到内容的值的字典,然后可以在程序中进一步使用它。

该程序的运行版本可以在here中找到,但是我还为您提供了代码,以防您只想复制粘贴它

using System;
using System.Linq;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class Program
{
    private static IDictionary<string,object> MapData( JObject source, IDictionary<string,string> map ) {
        var result = new Dictionary<string, object>();
        foreach (var kvp in map) {
            result.Add( kvp.Key, source.SelectToken( kvp.Value ).Value<object>() );
        }
        return result;
    }

    public static void Main()
    {
        string jsonContent = @"{
    ""Name"" : ""Hello"",
    ""This"" : {
        ""That"" : {
            ""TheOther"" : ""There""
        }
    }
}";
        string jsonMap = @"{
    ""Test_Name"" : ""Name"",
    ""Test_Value"": ""This.That.TheOther""
 }";
        var sourceObject = JsonConvert.DeserializeObject<JObject>( jsonContent );
        var sourceMap = JsonConvert.DeserializeObject<IDictionary<string, string>>( jsonMap );

        var result = MapData( sourceObject, sourceMap );
        foreach (var kvp in result) {
            Console.WriteLine( "{0}: {1}", kvp.Key, kvp.Value );
        }
    }
}

答案 2 :(得分:0)

我猜找到了名字的json结构。但这类似于我尝试做的方式。如果结构有所不同,请告诉我,我可以提供帮助。

string json = "{data:[{'Name':'Hello','This':{'That':{'TheOther':'There'}}},{'Name':'Hello2','This':{'That':{'TheOther':'There2'}}}]}";

var jsonArray = JToken.Parse(json);    
var selectedObject = jsonArray.SelectToken("$..[?(@.Name== 'Hello')]");
var result = selectedObject.ToString();

var value = JObject.Parse(result);
var selectedValue = value.SelectToken("This.That.TheOther");
var final = selectedValue.ToString();