来自文本文件的多个JSON对象

时间:2014-12-16 13:14:28

标签: php ios json xcode

您好我试图使用多个json对象,如下例所示。

[
  {
    "DateandTime" : "1025",
    "LoggingLevel" : "ERROR",
    "Description" : "Test"
  }
]
[
  {
    "DateandTime" : "1025",
    "LoggingLevel" : "ERROR",
    "Description" : "Test"
  }
]

这是它从iOS方面创建的方式,因为我一次只创建一个对象,因为它是报告日志记录系统,只需要一条消息传递给它#39 ;需要的。因此,Json对象在不同的​​时间创建并附加到文件中。

我知道有效的Json字符串如下所示。

[
  {
    "DateandTime" : "1025",
    "LoggingLevel" : "ERROR",
    "Description" : "Test"
  },

  {
    "DateandTime" : "1025",
    "LoggingLevel" : "ERROR",
    "Description" : "Test"
  }
]

然而,这不是我需要的。有没有办法使用两个独立的Json对象?

的iOS

    NSString *DataString = [NSString stringWithFormat:@"{ \"DateandTime\":\"%@\", \"Description\":\"%@\", \"LoggingLevel\":\"%@\" }", @"1025", logString, [self getLogTypeName:(LOGS)level]];
    NSMutableArray *CurrentData = [NSJSONSerialization JSONObjectWithData:[DataString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil];
    NSMutableArray *ArrayOfData = [[NSMutableArray alloc] init];
    [ArrayOfData addObject:CurrentData];
    NSData *JsonObject = [NSJSONSerialization dataWithJSONObject:ArrayOfData options:0 error:nil];
    NSString *jsonString = [[NSString alloc] initWithData:JsonObject encoding:NSUTF8StringEncoding];

    post = [NSString stringWithFormat:@"Message=%@", jsonString];

PHP

$file = 'testingFile.txt';
// Open the file to get existing content
$current = file_get_contents($file);
if (isset($_POST['Message'])) {
// Append a new person to the file
$current .= $_POST['Message'] . PHP_EOL; 
// Write the contents back to the file
file_put_contents($file, $current);

} else {
    $Contents = file_get_contents($file);
    echo $Contents;
}

的Javascript

function GetLoggingData() {
  $.get("../ISOSEC/logging/TestPHP.php", function(data){
      $.each($.parseJSON(data), function(idx, obj) {
         console.log(obj.DateandTime);
         console.log(obj.LoggingLevel);
         console.log(obj.Description);
         AddLog(obj.DateandTime, obj.LoggingLevel, obj.Description);
      });

  });
}

如果文件中已经存在json对象或是否还有其他解决方法,有人可以告诉我如何将对象合并在一起吗?

感谢。

2 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,您最好使用有效的JSON生成文件,而不是尝试解析自己的JSON语法。

您可以通过解析现有JSON并根据需要附加对象来实现此目的。

概念(未经测试)的例子:

NSMutableArray *currentData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers errors:&errors];
[currentData addObject:newObject];
NSData *updatedJSONData = [NSJSONSerialization dataWithJSONObject:currentData options:0 errors:&errors];

<强>更新

好的,就我看到你的问题而言,你有两种环境。你有客户端和服务器。我没有注意到的是,各个日志消息由PHP脚本处理。

以下是我在您的应用中所做的事情:

NSError *error;

// Simplify the generation of your dictionary
NSDictionary *logLine = @{
    @"DateandTime": @"1024"
    @"Description": logString,
    @"LoggingLevel": [self getLogTypeName:(LOGS)level]
};

// Create JSON string from dictionary
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:logLine options:0 error:&error];
NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

// Now post jsonStr as the HTTP body to your PHP script

这就是我在你的剧本中所做的:

<?php

$logFileName = 'testingFile.txt';

// Read your current log file contents
$currentLogJSON = file_get_contents($logFileName);

// Check the log for any contents
if (empty($currentLogJSON)) {
    $currentLog = [];
} else {
    $currentLog = json_decode($currentLogJSON);
    // Ensure that the contents of the log file is an array
    if (is_array($currentLog)) {
        $currentLog = [];
    }
}

// Get the new log line from HTTP body
$newLogLineJSON = file_get_contents('php://input');
// Decode the log line which is passed as JSON string
$newLogLine = json_decode($newLogLine);
if (json_last_error() == JSON_ERROR_NONE) {
    // Append the log line to the current log
    $currentLog[] = $newLogLine;
    // Write the updated log contents to log file
    file_put_contents($logFileName, json_encode($currentLog));
}

答案 1 :(得分:0)

如果你的文件看起来总是像第一个例子,你很可能只能制作一个preg_replace

这只是一个主题,它可能是一种不好的方式,但我认为它可以工作。

修改

试试这个

$NewSingleJsonString = preg_replace("/.\].\[.\s+/s",',',$MultipleJsonString);