使用Json.NET

时间:2018-08-15 16:54:59

标签: c# json firebase firebase-realtime-database json.net

我需要使用JSON.Net库将firebase-ish数据结构转换为C#对象。

我将数据存储在Firebase数据库中,如下所示;

 {
    "PoolDatas": {
        "-LGGJGTAv_DPtzkmjIbl": {
            "CoinType": 2,
            "PoolType": 4,
            "Alias": "First Alias",
            "Address": "0xAE12EF212",
            "Alarms": {
                "-LGsdsdv_DPtzkmjIbl": {
                    "Threshold": {
                        "Type": 2,
                        "Val": 100
                    },
                    "AlarmType": 3
                },
                "-LBAsdsdv_DPtzkmjIbl": {
                    "Threshold": {
                        "Type": 1,
                        "Val": 1
                    },
                    "AlarmType": 2
                }
            }
        },
        "-LEAJGTAv_DPtzkmjIbl": {
            "CoinType": 1,
            "PoolType": 1,
            "Alias": "Second Alias",
            "Address": "0xAeeeEF212",
            "Alarms": {
                "-LGsdsdv_DPtzkmjIbl": {
                    "Threshold": {
                        "Type": 10,
                        "Val": 120
                    },
                    "AlarmType": 1
                },
                "-LBAsdsdv_DPtzkmjIbl": {
                    "Threshold": {
                        "Type": 1,
                        "Val": 250
                    },
                    "AlarmType": 2
                }
            }
        }
    }
 }

所有列表对象都有Firebase生成的ID。我无法将此数据映射到C#类,因为Firebase ID不符合列表结构。

请在C#端查看我的模型;

public class PoolData
{
     public string FirebaseId{ get; set; }
     public string Alias { get; set; }
     public PoolType PoolType { get; set; } //enum
     public CoinType CoinType { get; set; } //enum
     public string Address { get; set; }
     public List<Alarm> Alarms { get; set; }
}

public class Alarm
{
     public string FirebaseId{ get; set; }
     public AlarmType AlarmType{ get; set; } //enum
     public Threshold Threshold { get; set; } //object
}

public class Threshold
{
     public ThresholdType Type{ get; set; } //enum
     public int Value { get; set; }
}

为了能够将Firebase格式的json转换为C#对象,我需要一个像这样的json;

{
   "PoolDatas": [
      {
         "FirebaseId": "-LGGJGTAv_DPtzkmjIbl",
         "CoinType": 1,
         "PoolType": 1,
         "Alias": "First Alias",
         "Alarms": [
            {
               "FirebaseId": "-LGsdsdv_DPtzkmjIbl",
               "Threshold": {
                  "Type": 1,
                  "Val": 1
               },
               "AlarmType": 1
            },
            {
               "FirebaseId": "-LBAsdsdv_DPtzkmjIbl",
               "Threshold": {
                  "Type": 1,
                  "Val": 1
               },
               "AlarmType": 2
            }
         ],
         "Address": "0xAE12EF212"
      },
      {
         "FirebaseId": "-LEAJGTAv_DPtzkmjIbl",
         "CoinType": 1,
         "PoolType": 1,
         "Alias": "First Alias",
         "Alarms": [
            {
               "FirebaseId": "-LGsdsdv_DPtzkmjIbl",
               "Threshold": {
                  "Type": 1,
                  "Val": 1
               },
               "AlarmType": 1
            },
            {
               "FirebaseId": "-LBAsdsdv_DPtzkmjIbl",
               "Threshold": {
                  "Type": 1,
                  "Val": 1
               },
               "AlarmType": 2
            }
         ],
         "Address": "0xAE12EF212"
      }
   ]
}

如何从第一个JSON获取此json?

我尝试了一些使用JObject循环的递归过程,但是没有用。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将JSON反序列化为def getChar(): import msvcrt return msvcrt.getch().decode('utf-8') ,更改每个值,以便字典的键进入FirebaseId属性,然后将其放入数组,如下所示:

Dictionary<string, PoolData>

您将需要安装并导入Json.Net软件包class Origin { public Dictionary<string, PoolData> PoolDatas { get; set; } } class Destination { public PoolData[] PoolDatas { get; set; } } class Program { static void Main(string[] args) { string json = File.ReadAllText("data.json"); var data = JsonConvert.DeserializeObject<Origin>(json); var destination = new Destination(); destination.PoolDatas = data.PoolDatas.Select(i => { i.Value.FirebaseId = i.Key; return i.Value; }).ToArray(); } }

编辑:如注释中所述,这不适用于嵌套对象。对于这种情况,也许您可​​以使用自定义序列化程序,如下所示:

using Newtonsoft.Json;

但是您可以看到解决方案开始变得有些复杂。除非您需要对许多类型执行此操作,否则手动转换可能会减少耗时且易于维护。