【问题标题】:How to create JSON String with nested array of values using JSON.NET?如何使用 JSON.NET 创建具有嵌套值数组的 JSON 字符串?
【发布时间】:2016-02-15 19:26:21
【问题描述】:

感谢 @don-jayamanne 和 @dbc 提到我的 JSON 格式必须正确

这是我改写的问题:

我们的应用程序正在使用 JSON.NET 创建 JSON 字符串。

这是我要创建的 JSON 字符串:

{
    "RouteID": "123321213312",
    "DriverName": "JohnDoe",
    "Shift": "Night",
    "ItineraryCoordinates": [
        [
            9393,
            4443
        ],
        [
            8832,
            3322
        ],
        [
            223,
            3432
        ],
        [
            223,
            3432
        ]
    ]
}

这是我为创建上述 JSON 字符串而编写的错误代码:

writer.WriteStartObject();
writer.WritePropertyName("RouteID");
serializer.Serialize(writer, routeID);

writer.WritePropertyName("DriverName");
serializer.Serialize(writer, driverName);

writer.WritePropertyName("Shift");
serializer.Serialize(writer, shift);

writer.WritePropertyName("ItineraryCoordinates");

ItineraryCoordinatesCollectionFactory tpCollFac = new ItineraryCoordinatesCollectionFactory();
ItineraryCoordinates anItineraryCoordinates;

StringBuilder coordSB = new StringBuilder();

IList<TimePeriod> ItineraryCoordinatesCollection = tpCollFac.createItineraryCoordinatesCollection();
for (int j = 0; j < ItineraryCoordinatesCollection.Count(); j++)
{
    anItineraryCoordinates = ItineraryCoordinatesCollection[j];

    writer.WriteStartObject();
    writer.WritePropertyName("nested");
    coordSB.Append(anItineraryCoordinates.StartTimePeriodCoordinate.X.ToString());
    coordSB.Append(" , ");
    coordSB.Append(anItineraryCoordinates.StartTimePeriodCoordinate.Y.ToString());

    serializer.Serialize(writer, coordSB.ToString());
    writer.WriteEndObject();

    coordSB.Clear();

    writer.WriteStartObject();
    writer.WritePropertyName("nested");
    coordSB.Append(aTimePeriod.EndTimePeriodCoordinate.X.ToString());
    coordSB.Append(" , ");
    coordSB.Append(aTimePeriod.EndTimePeriodCoordinate.Y.ToString());
    serializer.Serialize(writer, coordSB.ToString());

    coordSB.Clear();
    writer.WriteEndObject();

} // end of for (int j = 0; j < OrderedTimePeriodsCollection.Count(); j++)

writer.WriteEndObject(); // closing off Json Object LogEventsTimePeriods

每当我在代码中更改writer.WriteStartObject() 的位置时,我都会收到以下错误:

状态 Object 中的令牌 StartObject 将导致 JSON 对象无效。路径''。

谁能给出一个粗略的代码草案,说明如何使用 JSON.NET 写出我想要的 JSON 字符串?

【问题讨论】:

  • 您的 JSON 字符串无效。这就是您无法生成这样一个字符串的部分原因。使用以下内容验证您的 JSON 字符串 jsonlint.com
  • 上传你的 JSON 到 jsonlint.com 你会发现它是无效的。可能您希望 "ItineraryCoordinates" 成为 array 而不是对象。

标签: c# json nested json.net converters


【解决方案1】:

正如在 cmets 上所说,您的 JSON 无效,它可能应该是:

{

    "RouteID": "123321213312",
    "DriverName": "JohnDoe",
    "Shift": "Night",
    "ItineraryCoordinates": [
        [ 9393, 4443 ],
        [ 8832, 3322 ],
        [ 223, 3432 ],
        [ 223, 3432 ]
    ]           
}

这里有一个示例,它向您展示了构建示例 JSON 的两种方法:

public class Route
{
    public string RouteID { get; set; }
    public string DriverName { get; set; }
    public string Shift { get; set; }

    public int[][] ItineraryCoordinates;


    public static string GetSampleJson() {

        var sampleRoute = new Route
        {
            RouteID = "123321213312",
            DriverName = "JohnDoe",
            Shift = "Night",
            ItineraryCoordinates = new int[][] { 
                new int[] {9393, 4443 },
                new int[] { 8832, 3322 },
                new int[] {  223, 3432 },
                new int[] { 223, 3432 }
            }
        };

        return JsonConvert.SerializeObject(sampleRoute, Formatting.Indented);
    }

    public static string GetSampleJson2()
    {
        var route = new JObject(
            new JProperty("RouteID", "123321213312"),
            new JProperty("DriverName", "JhonDoe"),
            new JProperty("Shift", "Night"),
            new JProperty("ItineraryCoordinates", new JArray(
                    new JArray(9393, 4443),
                    new JArray(8832, 3322 ),
                    new JArray( 223, 3432 ),
                    new JArray( 223, 3432)
                )
            ));

        return route.ToString();
    }
}

【讨论】:

  • 是的,我刚刚在您发帖时更正了 JSON。谢谢。
  • 我认为您正在采用非常复杂的路线来构建 JSON。
猜你喜欢
  • 1970-01-01
  • 2021-08-22
  • 2021-05-03
  • 1970-01-01
  • 2017-04-25
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多