簡體   English   中英

如何通過使用 C# regex for elasticsearch 將 json 格式的句子轉換為另一個?

[英]How can I convert json format sentence to another one by using C# regex for elasticsearch?

我有非常奇怪的 json 問題。 我需要將 UrlQueryString 轉換為 elasticsearch 的另一個標准。 當您查看下面的內容時,您會看到 2 json 。 我想改變 :
FROM "UrlQueryString": "checkinDate: 2020-07-01,checkoutDate: 2020-07-05,room: Y,Y,Y",
TO "UrlQueryString": {"checkinDate":"2020-07-01","checkoutDate":"2020-07-05","room": "Y,Y,Y"}

我怎樣才能做到這一點? 我認為我需要正則表達式或其他選項。 我也通過使用替換和刪除為此嘗試了很多次。

我有以下字符串json:


{
  "LogLevel": "Information",
  "CorrelationId": "44160536-a1e9-4a5b-a19d-9e2323ebfa7a",
  "UrlMethod": "GET",
  "Data": "",
  "UrlQueryString": "checkinDate: 2020-07-01,checkoutDate: 2020-07-05,room: Y,Y,Y",
  "UrlPath": /xxxx",
  "LogSource": "source1",
  "LogDate": "2019-12-28T07:39:24.2434156Z",
  "Environment": "xxxx"
}

我想要的結果:

{
  "LogLevel": "Information",
  "CorrelationId": "44160536-a1e9-4a5b-a19d-9e2323ebfa7a",
  "UrlMethod": "GET",
  "Data": "",
  "UrlQueryString": {"checkinDate":"2020-07-01","checkoutDate":"2020-07-05","room": "Y,Y,Y"},
  "UrlPath": "/xxxx",
  "LogSource": "source1",
  "LogDate": "2019-12-28T07:39:24.2434156Z",
  "Environment": "xxxx"
}

重要提示:不要忘記一些東西。 UrlQueryString 不是靜態的。 它完全是動態的。 在一天結束時;

"UrlQueryString": {"Parameter2": "bird"," anyvalue": "fly"}

或者

"UrlQueryString": {"Parameter2": "bird"," anyvalue": "fly","Parameter3": "bird"," anyvalue2": "fly"}
{
  "LogLevel": "Information",
  "CorrelationId": "44160536-a1e9-4a5b-a19d-9e2323ebfa7a",
  "UrlMethod": "GET",
  "Data": "",
  "UrlQueryString": {"Parameter1": "Kuş"," test1": "1577518755769"},
  "UrlPath": "/Json/AutoCompleteHotelCallBack",
  "LogSource": "xxxrwr",
  "LogDate": "2019-12-28T07:39:24.2434156Z",
  "Environment": "xx-1"
}

你可能想得太復雜了。
您只需使用普通的字符串替換即可輕松逃脫。 而且也不會有風險,除非其中一個值可以以某種方式獲得與鍵相同的值。 不過好像不太可能。

也許不是最專業的解決方案,但我懷疑這就是你所追求的。 或者如果你是,我很抱歉。

因此,在該特定行上只需替換幾個字符串,就可以將其解析為 json。
例子:

.Replace("\"checkinDate: ", "{\"checkinDate:\"")
.Replace(",checkoutDate: ", "\",\"checkoutDate\":\"")

UrlQueryString值不是有效的 json 或可以使用標准流程轉換為 json 的內容

問題:

  1. 它是一個沒有花括號{}的字符串。
  2. 它是一個帶有鍵和值表示的字符串,沒有引號 {"key", "value"}
  3. 您可以嘗試對,:進行拆分,但這不會像您那樣工作,在您的值中以對象(JArray 或 JObject)作為值的可能性。 {"key": "val,ue"}{"key": { "key2": "value" } }

當您可以確定該字符串中只有鍵和字符串文字值時,您可以使用以下方法將該字符串轉換為 json。 {"key": "value", "key2": "val,ue2"}

  1. string轉換為按順序包含鍵和值的array
  2. 將數組轉換為Dictionary<string,string>以便JsonConvert可以轉換為對象。
    public static object ConvertStringToJson (string convertThisToJson)
    {
        if (string.IsNullOrEmpty(convertThisToJson))
            return JsonConvert.DeserializeObject<object>(JsonConvert.SerializeObject("{}"));

        string[] splitStr = convertThisToJson.Split(':');
        Dictionary<string, string> dict = new Dictionary<string, string>();
        string key, value;

        // First element will always be Key
        key = splitStr[0];

        // Everything in the middle will be Value/NextKey pair (not key/Value)
        for (int i = 1; i < splitStr.Count() - 1; i++)
        {
            // You suggested your value could have commas ... thus LastIndexOf
            int indexSplit = splitStr[i].LastIndexOf(",");

            value = splitStr[i].Substring(0, indexSplit);
            dict.Add(key, value.Trim());

            key = splitStr[i].Substring(indexSplit + 1);
        }

        // Last element in its entirety will be value.
        value = splitStr[splitStr.Length - 1];
        dict.Add(key, value.Trim());

        // You can choose to do either of these.
        //return JsonConvert.SerializeObject(dict); // Do change the return type if you decide to go with this.
        return JsonConvert.DeserializeObject<object>(JsonConvert.SerializeObject(dict));
    }

並像這樣使用它

    string str = "checkinDate: 2020-07-01,checkoutDate: 2020-07-05,room: Y,Y,Y";
    object jsonObj = ConvertStringToJson(str);
    Console.WriteLine(jsonObj.ToString()); // Print Json Object
    Console.WriteLine(JsonConvert.SerializeObject(jsonObj)); // Print String

輸出

// Json Object.
{
  "checkinDate": "2020-07-01",
  "checkoutDate": "2020-07-05",
  "room": "Y,Y,Y"
}

// String
{"checkinDate":"2020-07-01","checkoutDate":"2020-07-05","room":"Y,Y,Y"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM