這是我正在接收的 JSON,已經過濾。(它來自谷歌的地方自動完成API)
{
"predictions": [
{
"description": "Frankfurt am Main, Deutschland",
"place_id": "ChIJxZZwR28JvUcRAMawKVBDIgQ",
},
{
"description": "Frankfurt (Oder), Deutschland",
"place_id": "ChIJb_u1AiqYB0cRwDteW0YgIQQ",
},
{
"description": "Frankfurt Hahn Flughafen (HHN), Lautzenhausen, Deutschland",
"place_id": "ChIJX3W0JgQYvkcRWBxGlm6csj0",
}
],
"status": "OK"
}
我需要把這個 JSON 轉換成這種格式:
{
"success":true,
"message":"OK",
"data":[
{
"description":"Frankfurt Hahn Flughafen (HHN), Lautzenhausen, Deutschland",
"id":"ChIJX3W0JgQYvkcRWBxGlm6csj0"
},
{
"description":"Frankfurt Airport (FRA), Frankfurt am Main, Deutschland",
"id":"ChIJeflCVHQLvUcRMfP4IU3YdIo"
},
{
"description":"Frankfurt Marriott Hotel, Hamburger Allee, Frankfurt am Main, Deutschland",
"id":"ChIJdag3xFsJvUcRZtfKqZkzBAM"
}
]
}
I would be very g
所以預測只是重命名為“資料”,我們將重命名狀態更改為訊息,將其向上移動并添加成功,如果之前發生的 http-request 成功與否。這在第一次捕獲時似乎并不難,但我似乎無法找到在 C# 中轉換或重新排列 JSON 的資源。
我將非常感謝任何提示或資源,這樣我就可以擺脫這個可能并不那么困難的任務。我應該提到我對這一切都很陌生。
謝謝大家!
uj5u.com熱心網友回復:
首先創建代表您的json的類
public class Prediction
{
public string description { get; set; }
public string place_id { get; set; }
}
public class InputJsonObj
{
public Prediction[] predictions { get; set; }
public string status { get; set; }
}
public class Datum
{
public string description { get; set; }
public string id { get; set; }
}
public class OutPutJsoObj
{
public bool success { get; set; }
public string message { get; set; }
public List<Datum> data { get; set; }
public OutPutJsoObj(){
data = new List<Datum>();
}
}
然后映射物件(手動或使用 AutoMapper 等任何映射庫)并創建最終的 json。
using Newtonsoft.Json;
InputJsonObj inputObj = JsonConvert.DeserializeObject<InputJsonObj >(inputJson);
OutPutJsoObj outObj = new OutPutJsoObj ();
foreach(var p in inputObj)
{
outObj.Data.Add(new Datum() { descriptions = p.descriptions , id= p.place_id }
}
string outJson = = JsonConvert.SerializeObject(outObj);
uj5u.com熱心網友回復:
只需決議原始 json 并將資料移動到新的 json 物件
var origJsonObj = JObject.Parse(json);
var fixedJsonObj = new JObject {
new JProperty("success",true),
new JProperty("message",origJsonObj["status"]),
new JProperty("data",origJsonObj["predictions"])
};
從你的問題中不清楚什么應該是成功的價值,但我想也許你也需要這條線
if (fixedJsonObj["message"].ToString() != "OK") fixedJsonObj["success"] = false;
如果你只需要一個固定的 json
json = fixedJsonObj.ToString();
或者您可以創建 c# 類(例如資料)并反序列化
Data result= fixedJsonObj.ToObject<Data>();
uj5u.com熱心網友回復:
我喜歡@Serge的答案,但是如果您正在尋找一種強型別的方法,我們可以將輸入和輸出結構建模為同一組類,并且輸出結構相似,具有相同的關系,但只有不同或額外的名稱嘗試這個:
- 本文描述了此處使用的程序,但實際上我們創建了只寫屬性,這些屬性將在反序列化程序中接收資料,并將其格式化為輸出中預期的屬性。
public class ResponseWrapper
{
[JsonProperty("success")]
public bool Success { get;set; }
[JsonProperty("message")]
public string Message { get;set; }
[Obsolete("This field should not be used anymore, please use Message instead")]
public string Status
{
get { return null; }
set
{
Message = value;
Success = value.Equals("OK", StringComparison.OrdinalIgnoreCase);
}
}
[JsonProperty("data")]
public Prediction[] Data { get;set; }
[Obsolete("This field should not be used anymore, please use Data instead")]
public Prediction[] Predictions
{
get { return null; }
set { Data = value; }
}
}
public class Prediction
{
public string description { get; set; }
public string place_id { get; set; }
}
然后您可以使用以下代碼反序列化和重新序列化:
using Newtonsoft.Json;
...
var input = JsonConvert.DeserializeObject<ResponseWrapper>(input);
var output = JsonConvert.SerializeObject(objs, new JsonSerializerSettings
{
Formatting = Newtonsoft.Json.Formatting.Indented,
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore
});
這是一個你可以測驗的小提琴:https://dotnetfiddle.net/DsI5Yc 和輸出:
{
"success": true,
"message": "OK",
"data": [
{
"description": "Frankfurt am Main, Deutschland",
"place_id": "ChIJxZZwR28JvUcRAMawKVBDIgQ"
},
{
"description": "Frankfurt (Oder), Deutschland",
"place_id": "ChIJb_u1AiqYB0cRwDteW0YgIQQ"
},
{
"description": "Frankfurt Hahn Flughafen (HHN), Lautzenhausen, Deutschland",
"place_id": "ChIJX3W0JgQYvkcRWBxGlm6csj0"
}
]
}
如果您要費心為反序列化撰寫轉換器,那么我發現這個解決方案要簡單一些。在公開其他屬性以允許遺留資料映射到當前代碼庫時,我傾向于使用這種型別的解決方案。
- 保持類中包含的映射和邏輯
- 告訴開發人員仍在針對已棄用的結構撰寫有關更改的代碼
您還可以對此進行擴充并實作一個全域轉換器以省略過時的屬性,這將為您提供完全的向后兼容性,直到您更新源以停止發送遺留結構。這是這樣一個解決方案的小提琴:https ://dotnetfiddle.net/MYXtGT
- 受這些帖子的啟發:
- 反序列化期間的 JSON.Net Ignore Property
- 有沒有辦法讓 JavaScriptSerializer 忽略某個泛型型別的屬性?
- 通過自定義屬性(json.net)從序列化中排除屬性
- Json.NET:條件屬性序列化
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/526721.html
標籤:C#json
