如何通过引用同一 JSON 中的另一个键来获取键的值?另外如何将字符串添加到 uri 的末尾?

How to get value of a key by referencing another key in the same JSON?? Also how to add string to the end of uri?

请参考下面的JSON:-

{
    "operations": [
        {
            "creationTime": "2022-06-02T10:28:28.765+03:00",
            "deviceId": "43432103",
            "deviceName": "P25-SC-0228",
            "id": "121985460",
            "status": "PENDING",
            "com_cumulocity_model": {
                "op": "s",
                "param": "waterStartDateTime",
                "value": "1/2/2018, 7:30:00 AM"
            },
            "description": "Generate Plan"
        },
        {
            "creationTime": "2022-06-02T10:28:36.276+03:00",
            "deviceId": "43432103",
            "deviceName": "P25-SC-0228",
            "id": "121985465",
            "status": "PENDING",
            "com_cumulocity_model": {
                "Mode": 0,
                "StopStationPayload": "[{\"ControllerAddress\":11,\"StationAddress\":26}]"
            },
            "description": "Stop Station"
        }
    ],
    "statistics": {
        "currentPage": 1,
        "pageSize": 5
    }
}

请在下面找到我的代码:-

namespace handleDeviceOperations
{
    
class Program
{

string operationID = String.Empty;
static async Task Main(string[] args)
{
    var serviceCollection = new ServiceCollection();
    ConfigureServices(serviceCollection);
    var services = serviceCollection.BuildServiceProvider();
    var httpClientFactory = services.GetRequiredService<IHttpClientFactory>();

    var httpClientGetOperations = httpClientFactory.CreateClient("getOperations");
    var request1 = await httpClientGetOperations.GetAsync("");

    if (request1.IsSuccessStatusCode)
    {
        var responseMessage1 = await request1.Content.ReadAsStringAsync();
        JObject obj = JObject.Parse(responseMessage1);
        var root = JsonConvert.DeserializeObject<RootObject>(responseMessage1);

        RootObject myDeserializedObject = JsonConvert.DeserializeObject<RootObject>(responseMessage1);
        
        if (obj["operations"].HasValues)
        {
            foreach(var item in myDeserializedObject.operations)
            {
                switch(item.description)
                {
                    case "Generate Plan":
                        var gen_plan=JObject.Parse(responseMessage1)["operations"];
                        string[] gen_plan_list_operationID =gen_plan.Select(o => (string) o["id"]).ToArray();
                        JObject[] gen_plan_list_payload = gen_plan.Select(o => (JObject) o["com_cumulocity_model"]).ToArray();
                        break;

                    case "Stop Station":
                        var stop_st=JObject.Parse(responseMessage1)["operations"];
                        string[] stop_st_list_operationID =stop_st.Select(o => (string) o["id"]).ToArray();
                        JObject[] stop_st_list_payload = stop_st.Select(o => (JObject) o["com_cumulocity_model"]).ToArray();

                        var httpClientStopStation = httpClientFactory.CreateClient("executeOperations");
                        var request4 = await httpClientStopStation.PostAsync("");
                        break;
                }
            }
        }
    }
}

private static void ConfigureServices(ServiceCollection services)
{

    services.AddHttpClient("getOperations", options =>
    {
        options.BaseAddress = new Uri("https://myurl.com?deviceId=43432103");

        options.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic","auth value");
    });

    services.AddHttpClient("executeOperations", options =>
    {
        options.BaseAddress = new Uri("https://myurl.com/"+operationID);
        options.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic","auth value");
        options.DefaultRequestHeaders.Add("Accept", "application/vnd.com.nsn.xyz.operation+json");
    });
    
}
public class RootObject
{
    public List<operation> operations { get; set; }
}
public class operation
{
    public golfController com_cumulocity_model { get; set; }
    public string description {get; set;}
}
public class golfController
{
    public int mode { get; set; }
    public string StopStationPayload { get; set; }
}
}
}

问题 #1

在 switch case 中,我想获取属于同一个 JSON 对象的 com_cumulocity_modelid 的值,其中 case(value_of_description) 得到满足。 例如 : 如果满足 case "Stop Station":,我想在其中获取 com_cumulocity_modelid 的等效值,即分别为 {"Mode": 0,"StopStationPayload": "[{\"ControllerAddress\":11,\"StationAddress\":26}]"}"121985465"。它必须与 case 内的值进行比较,并以此为基础获取。

问题 #2

我们如何将上面讨论的 id = "121985465" 的值添加到 url 的末尾,以便在 var httpClientStopStation = httpClientFactory.CreateClient("executeOperations"); var request4 = await httpClientStopStation.PostAsync(""); 行的 case("Stop Station") 内发出 PostAsync 请求?

捷径。如果你只需要 com_cumulocity_model

var operations = JObject.Parse(json)["operations"];

var com_cumulocity_model = operations.Where(o => (string) o["description"] == "Stop Station")
.Select(o => o["com_cumulocity_model"])
.FirstOrDefault();

Console.WriteLine(com_cumulocity_model.ToString());

结果

{
  "Mode": 0,
  "StopStationPayload": "[{\"ControllerAddress\":11,\"StationAddress\":26}]"
}

但是如果您需要整个数据,您可以使用此代码反序列化 json。

var data = JsonConvert.DeserializeObject<Data>(json);

classes

public class Data
{
    public List<Operation> operations { get; set; }
    public Statistics statistics { get; set; }
}
public class Operation
{
    public DateTime creationTime { get; set; }
    public string deviceId { get; set; }
    public string deviceName { get; set; }
    public string status { get; set; }
    public ComCumulocityModel com_cumulocity_model { get; set; }
    public string description { get; set; }
}
public class ComCumulocityModel
{
    public string op { get; set; }
    public string param { get; set; }
    public string value { get; set; }
    public int? Mode { get; set; }
    public string StopStationPayload { get; set; }
}

public class Statistics
{
    public int currentPage { get; set; }
    public int pageSize { get; set; }
}

如果不需要,您可以从数据中删除统计信息 class 和统计信息 属性。其他属性也一样

现在您可以使用 Linq 获取任何数据,例如

ComCumulocityModel com_cumulocity_model = data.operations
.Where(o => o.description == "Stop Station")
.Select(o => o.com_cumulocity_model)
.FirstOrDefault();

结果(json 格式)

{
  "Mode": 0,
  "StopStationPayload": "[{\"ControllerAddress\":11,\"StationAddress\":26}]"
}

如何打印

    var jsonSettings = new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Ignore,
        Formatting=Newtonsoft.Json.Formatting.Indented
    };
    Console.WriteLine(JsonConvert.SerializeObject(  com_cumulocity_model,  jsonSettings));